Wikibooks
enwikibooks
https://en.wikibooks.org/wiki/Main_Page
MediaWiki 1.47.0-wmf.19
first-letter
Media
Special
Talk
User
User talk
Wikibooks
Wikibooks talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Cookbook
Cookbook talk
Transwiki
Transwiki talk
Wikijunior
Wikijunior talk
Subject
Subject talk
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Non-Programmer's Tutorial for Python 2.6
0
10033
4669591
4669483
2026-09-10T12:56:08Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-49226-92|~2026-49226-92]] ([[User talk:~2026-49226-92|talk]]) to last version by ShakespeareFan00
4666568
wikitext
text/x-wiki
__NOTOC__
{{center|Python 2 was [https://www.python.org/doc/sunset-python-2/ sunset in January 2020] and is no longer recommended for use. For a version of this book which targets Python 3, see [[Non-Programmer's Tutorial for Python 3]].}}
==Contents==
{{Book Search}}
{{Print version}}
{{PDF version}}
{{Wikipedia|Python (programming language)}}
;[[/Authors/]]
: Contributors to this book
;[[/Front matter|Front matter]] {{stage short|100%|Sep 20, 2007}}
: Initial remarks
;[[/Intro|Intro]] {{stage short|100%|Sep 20, 2007}}
: Installing and using Python – where to get help
;[[/Hello, World|Hello, World]] {{stage short|100%|Sep 20, 2007}}
: The famous first program – screen output – numbers and calculations
;[[/Who Goes There?|Who Goes There?]] {{stage short|100%|Sep 20, 2007}}
: Interactive input – strings
;[[/Count to 10|Count to 10]] {{stage short|100%|Sep 20, 2007}}
: <code>while</code> loops
;[[/Decisions|Decisions]] {{stage short|100%|Sep 20, 2007}}
: <code>if</code> statements
;[[/Debugging|Debugging]] {{stage short|100%|Sep 20, 2007}}
: Finding out what goes wrong
;[[/Defining Functions|Defining Functions]] {{stage short|100%|Sep 20, 2007}}
: Structuring programs with the use of functions
;[[/Advanced Functions Example|Advanced Functions Example]] {{stage short|75%|May 05, 2010}}
: (Almost) mind-blowing example of how programmers can think
;[[/Lists|Lists]] {{stage short|100%|Sep 20, 2007}}
: Variables containing more than one value
;[[/For Loops|For Loops]] {{stage short|100%|Sep 20, 2007}}
: A second kind of loop
;[[/Boolean Expressions|Boolean Expressions]] {{stage short|100%|Sep 20, 2007}}
: Computer logic – <code>true</code> and <code>false</code> – <code>and</code> and <code>or</code> – <code>not</code>
;[[/Dictionaries|Dictionaries]] {{stage short|100%|Sep 20, 2007}}
: Variables containing key/value pairs
;[[/Using Modules|Using Modules]] {{stage short|75%|Sep 20, 2007}}
: Extensions to the standard set of functionality
;[[/More on Lists|More on Lists]] {{stage short|75%|Sep 20, 2007}}
: Using elements or parts of lists
;[[/Revenge of the Strings|Revenge of the Strings]] {{stage short|100%|Sep 20, 2007}}
: Advanced text manipulation
;[[/File IO|File IO]] {{stage short|100%|Sep 20, 2007}}
: Reading from files and writing to files
;[[/Dealing with the imperfect|Dealing with the imperfect]] {{stage short|75%|Sep 20, 2007}}
: How to handle errors
;[[/The End|The End]] {{stage short|25%|Sep 20, 2007}}
: How to go further
;[[/FAQ|FAQ]] {{stage short|50%|Sep 20, 2007}}
: Some frequently asked questions
{{shelves|Python programming language}}
{{alphabetical|N}}
{{status|100%}}
[[ms:Tutorial Python untuk bukan pengatur cara]]
kbz3ksigzyk7t1d1oxsblh6vz5b5ktn
Human Physiology
0
10332
4669592
4669484
2026-09-10T12:56:18Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-49226-92|~2026-49226-92]] ([[User talk:~2026-49226-92|talk]]) to last version by R1F4T
4491427
wikitext
text/x-wiki
{{featured book}}
{{wikipedia}}
{{reading level|advanced}}
==Contents==
{{PDF version|Human Physiology}}
{{Print version|Human Physiology/Print Version}}
# [[/Physiology Introduction/]]
# [[/Homeostasis/]]
# [[/Cell physiology/|Cell Physiology]]
# [[/Integumentary System/]]
# [[/The Nervous System/]]
# [[/Senses/]]
# [[/The Muscular System/]]
# [[/Blood physiology/|Blood Physiology]]
# [[/The cardiovascular system/|The Cardiovascular System]]
# [[/The Immune System/]]
# [[/The Urinary System/]]
# [[/The respiratory system/|The Respiratory System]]
# [[/The gastrointestinal system/|The Gastrointestinal System]]
# [[/Nutrition/]]
# [[/The endocrine system/|The Endocrine System]]
# [[/The male reproductive system/|The Male Reproductive System]]
# [[/The female reproductive system/|The Female Reproductive System]]
# [[/Pregnancy and birth/|Pregnancy and Birth]]
# [[/Genetics and inheritance/|Genetics and Inheritance]]
# [[/Development: birth through death/|Development: Birth through Death]]
# [[/Appendix 1: answers to review questions/|Appendix 1: Answers to Review Questions]]
# [[/Human physiology authors/|Authors]]
# [[/Further_Reading/|Further Reading]]
==See also==
* [[Anatomy]]
* [[Human Anatomy]]
* [[Wikiversity:School:Medicine]]
{{Shelves|Physiology}}
{{alphabetical|H}}
{{status|100%}}
[[fr:Cours de physiologie]]
dynqp21osxi6htcwfd2lh54tupqa93f
Aros/User/Docs
0
13106
4669652
4669311
2026-09-11T09:44:23Z
Jeff1138
301139
4669652
wikitext
text/x-wiki
{{ArosNav}}
==What is AROS==
Google translation
[http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=nl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Dutch], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Italian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=da&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Danish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Polish], [http://translate.google.com/translate?hl=en&sl=auto&tl=ja&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Japanese], [http://translate.google.com/translate?hl=en&sl=auto&tl=ko&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Korean],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Portuguese],
*Computer Hardware
*AROS (operating system)
*Applications and Games
*User
[http://www.osnews.com/story/15819 AROS] is one of the intermediate levels between the computer hardware and the user. It is an open-source, clean-room implementation of AmigaOS 3.x that can be run on many different computer architectures. It runs primarily on PC x86 32bit and 64bit but also on amiga motorola 68k and compatibles, some ARM like the Pi and Apple Silicon, RISC-V and some old PowerPC.
This page will cover enough to be able to write the downloaded image to your preferred media, to run a LiveUSB, LiveCD or LiveDVD on your office/home PC (Live meaning you can test without changing your existing setup) and, ultimately, to use it.
Intel / AMD PC hardware support mostly covers the years 2000 to 2024. At the moment, AROS is '''not''' recommended to be '''installed''' on a working vital data holding machine. Instead, writing to and booting from a '''USB stick''' could be a much better option.
AROS is an hobby OS and can co-exist with Windows(TM), MacOSX(TM), Android(TM) or Linux(TM) and act as an alternative.
Unfortunately, Aros has few developers so upgrades and improvements can take [https://sourceforge.net/p/aros/mailman/aros-cvs/ time to appear].
AROS core is now [http://en.wikibooks.org/wiki/Aros/Developer/IncompleteAPIs ~80%] finished and is usable, so keep in mind that the software is still considered ALPHA/BETA and in constant development. Currently AROS is fun to play with on a curiosity level, but it is also interesting to program. AROS has some multimedia features and has internet access.
Most importantly, use AROS to its maximum potential as it stands now, find ways to have fun with it and share your experiences.
Good Sites to visit
: [https://www.arosworld.org/home.php Aros World User forum]
: [https://arosnews.github.io/ AROS News]
: [https://www.facebook.com/ArosWorkshop/ Aros Workshop],
: [https://www.osnews.com/topic/amiga-aros/ OSNews]
: [https://www.reddit.com/r/aros/ Reddit]
: [https://archives.arosworld.org Aros Archives]
: [https://aminet.net/ Aminet]
: [http://www.amiga-news.de/en/ English translation of German site]
: [https://aros.sourceforge.io AROS] with [https://aros.sourceforge.io/download.html ABIv1 downloads]
: [https://github.com/aros-development-team/AROS Aros ABIv1 Codebase]
: [https://github.com/aros-development-team/AROS/issues register ABIv1 issues] and [https://sourceforge.net/p/aros/bugs/ old defunct bugs notification site]
: [https://github.com/deadwood2 Deadwood's builds], [https://www.axrt.org/download/aros/v11/ v11 64bit PC builds], [https://axrt.org/downloads-aros Updated i386 32bit PC builds],
: [https://github.com/ezrec Ezrec x86 m68k mirror of old svn version]
: [https://sites.google.com/view/arosone Aros One x86, x64]
: [https://tinyarosdistro.flazio.com/ Tiny Aros x86 and x64]
: [https://arosnews.github.io/aros-portable/ AROS portable USB3 stick images of hosted Aros One x86 and x64 on debian]
: [http://vmwaros.blogspot.com Icaros Desktop x86 now on sabbatical, very old edition]
: [https://sites.google.com/site/arosaspireone AspireOS, of the netbook Aspire One, very old edition]
: [http://arosalive.blogspot.co.uk/p/10-basic-aros-how-tos-tutorials.html Basic How To guides]
: [http://arosgamer.blogspot.co.uk/ AROS Playground], [http://thewetmachine.net/tag/aros/ Jess Wet Machine], [https://aroshacking.wordpress.com/ Jon Robertson's AROS Experiences and FPC Free Pascal], [],
:[http://www.apollo-accelerators.com/ Apollo Accelerators m68k], [http://www.amigablogs.net/ Amiga Blogs], [http://blog.a-eon.biz/blog/ Trevor Dickinson blog],
: [https://forum.amiga.org/ Amiga OS AOS 3.x forum]
: [http://eab.abime.net/ EAB Amiga]
: [http://www.amigaworld.net/ AmigaWorld]
: [http://www.ppa.pl/ Polish Amiga Like News]
: [http://www.apollo-core.com/ Apollo Forum]
: [https://amigaalive.blogspot.com/ AmigaAlive]
: [https://www.amigalove.com/software Disk Mags]
: [https://amigachristmastree.ultimateamiga.com/ Xmas Amiga Game Jam]
: [https://www.reddit.com/r/amiga/ Amiga]
== Distributions aka Distros ==
For end users there are distributions (ready made with selected apps aiming to be easy to use), mostly created and maintained by one person in their own workflow/style. They reuse the nightly boot compiles to suit their needs and possibly other end users. You are free to create your own if required.
* For native 64bit Intel/AMD: [https://sites.google.com/view/arosone Aros One x64], [https://tinyarosdistro.flazio.com/ Tiny Aros],
* For native 32bit Intel/AMD which will run on 64bit machines: [https://sites.google.com/view/arosone Aros One x86], [https://www.tinyaros.it/ Tiny Aros],
* For native 68k [https://sites.google.com/view/arosone Aros One m68k], [http://www.aros-platform.de/ AROS Vision],
'''Please, keep in mind that the distros listed above use a different ABI (abi v11) , which is NOT binary compatible with the official ABI V1.'''
* For hosted Linux usb drive image [https://arosnews.github.io/aros-portable/ x64 Debian hosted version of Aros One],
* For hosted ARM there is [https://github.com/jonx/AROS-AArch64/releases alpha for Apple Silicon] and [https://aros.sourceforge.io/nightly1.html RaspberryPi 3 raspi-aarch64-system native 64bit]
AROS was originally developed on Linux but can run on an Intel-based Linux distro as an app. As time has gone on, it can be run as an app on many more operating systems (Windows, FreeBSD, Linux and limited on MacOS). This may sound strange: an OS running on top of another OS.
Basically, this is to take advantage of drivers (audio, internet, graphics, etc.) and compiler environments, in the existing OS, with which people may be already familiar. The term we use for what AROS does is "Hosted".
AROS Native is the term coined to describe AROS being run without any OS underneath it. It runs alone just like AmigaOS(TM) did. As this version does not benefit from "Hosted" drivers, dedicated ones have to be ported/written. Hence the smaller range of supported hardware / peripherals. We have other pages highlighting this support
AROS is open source so basically everyone can take part. The source is public on github and there are new commits most days. AROS is automatically compiled daily, result are the nightly builds hosted on Sourceforge. The nightly builds are only used for testing changes, testing software and the starting point for distribution maintainers or even your own distribution. They are very basic, miss some functionality and apps like web browsers and generic general appearance which can be changed.
* The [https://sourceforge.net/projects/aros/files/nightly2/ Nightly2], [http://aros.sourceforge.net/download.php nightly builds File Release Service] or [http://aros.sourceforge.net/downloads/ Sourceforge Project Web builds] are made automatically every night directly from the Github and in the past, SVN (Subversion) tree and contain the latest code for the AROS operating system. It should be noted that the builds have not been tested in any way and can be horrible broken.
*ABIv11 offspring of 64bit PC ABIv1 i.e. another PC 64bit build
*ABIv1 standard for most nightly builds, it is where the most work is done by developers
*ABIv0 standard for PC 32bit intel / amd PC distributions for historic reasons
==Media==
AROS media tends to boot in this tier list of media types, first internal HDD SSD, CD DVD drive, and finally usb drive (last two can depend on bios boot order)
* USB .VHD
[https://sites.google.com/view/arosone Aros One x86 and x64], with md5 below
<pre>
0a656d53a9c902e9934000d8392e30ec *ArosOne-USB-1.3-64Bit.zip
7dd7119ab3e56d75ee852c137226b4d7 *ArosOne-USB-v1.2-x86_64-v11.zip
cf906eeaad4a83b3520b1896bdc6b0d3 *ArosOne-USB-v1.1-x86_64-v11.zip
e2eb8fe8cfd61c567b0152a61cf85251 *ArosOne-x86-v2.8-USB-IMG.zip
559909c75c2f56472c74267a7d075355 *ArosOne-x86-v2.7-USB-IMG.zip
93da5898508c1a8c05bb8991ab7bd117 *AROS One Image-USB-2.4.zip
59fcabd7090e47f12d54f7eb78cf0f45 *ArosOne-x86-v2.2-USB-Image.zip
24fb8de726ae8fc5fe5bac6d30f03dc5 ArosOne-x86-v2.0-USB-Image.zip
f3d725e990072edce633b59747911b6b ArosOne-x86-v1.8-USB-IMG.zip
e089a24ae310e92fcc407a0125602ce8 Aros-One x86-IMG-USB-v1.6.zip
</pre>
[https://tinyaros.flazio.com/ Tiny AROS]
22bc993625b7c75b17263c0cc7e7baaa *Tiny Aros_copy.vhd (March 2024)
There is usually a vhd image inside the zip that can be written to USB sticks which is so much faster than the old ISO written to physical CD DVD method. This .vhd can be written to an USB stick / ssd with these pieces of software below but it will erase the previous contents from the usb
Windows - [https://www.raspberrypi.com/software/ RPi Raspberry Imager, use custom and see all files], [https://hddguru.com/software/HDD-Raw-Copy-Tool/ HDD-Raw-Copy-Tool], [https://rufus.ie/ Rufus up to version 3.20 may work with VirtualBox HD vhd images with Win7 but not some Rufus 4.x versions], [https://etcher.balena.io/ Balena Etcher but may spy on you],
Linux - [https://www.raspberrypi.com/software/ Raspberry Imager Ubuntu], Suse Image / Multi writer, dd,
Mac -
* Virtual Machine .ISO or CDs DVDs
The native iso images are currently not compatible with Ventoy, Yumi, MultiBootUSB, Easy2Boot E2B, or similar
<pre>
617a905b1665128c5e05f94dcc48e7f1 *AROS-One-v1.3-64Bit-v11.zip
11c8a147fcad7ecf52ae3a43e1934b69 *ArosOne-DVD-v1.2-x86_64-v11.zip
f93053d3b9ccf304d7e6ac3389e1987b *ArosOne-DVD-v1.1-x86_64-v11.zip
86d808a40dc7be389a758799a9b4f595 *ArosOne-x86-v2.0-ISO-DVD.zip
f1fc8599ef6a39e5df394e0f41d55526 *AROS-One-x86-ISO-DVD-v1.6.zip
</pre>
You can use a virtual emulator like VirtualBox, VMWare to mount the iso image which can then be used to boot and/or install to USB.
No current software can write an AROS ISO to a Pendrive. The author of ‘Rufus’ (who used an Amiga 500 as a child) once tried, but when he saw the system composition, he said he was unable to do it.
The solution is to boot the ISO from a VM (WMware, VBox), then install the AROS build on the Pendrive, which will eventually become a Live Pendrive that can be booted on a PC.
The only precaution is that in some cases it is necessary to thoroughly clean the Pendrive of any partitions and remove any bootloader that is not AROS. The Pendrive must remain raw without any partitions.
You can clean the USB stick on a PC with a program that manages hard disks. You need to do a partition wipe. On some USB sticks, you can clean it with InstallAROS.
For some USB pendrives, please use a reputable partition editor to remove any and all partitions from a usb pendrive as HDToolbox cannot do this task sometimes with a wipe all option.
Previously the only installation option was CD-RW or DVD-RW, since the whole system can be burnt onto a single disk and can be reused when the next version is released. Good branded discs like Taiyo Yuden (later JVC) or Verbatim should be used to reduce frustration later. The days for this media is gone but kept here for information
Since nobody currently sells AROS on any other media, you will need access to a CD/DVD burner to create the installation disk yourself. After it is on a CD or DVD, then access and writing to USB pendrives becomes available (this should be viewed as an outdated or last resort alternative method now), as well as using good USB manufacturers like Sandisk, Kingston, etc. rather than some other no-names.
Try burning it to a CD-RW or DVD-RW using your CD/DVD burning program (most burning software have a burn iso option). The ideal writing speed is 2x or 4x, higher speeds can give errors and problems. Check the writing integrity of your CD or DVD if your software has an option to do so before going any further.
Standalone portable usb cd dvd drives do not boot physical burnt discs, please use an internal ide sata drive instead.
* SD-card
For [https://aros.sourceforge.io/nightly1.html ARM Pi Aros 64bit], copy the files onto a FAT32 formatted micro SD card.
==Booting==
The LiveUSB, and in the past LiveCD LiveDVD, is designed to trial (test drive) various operating systems without having to install them to your working system.
Since 2011, UEFI was introduced to replace the original PC BIOS which made booting media more confusing. Some changes in the UEFI/bios may be needed
*go into the bios using esc, f2 or f? and disable the Security -> Secure Boot and maybe apply option for Legacy IDE mode
*you may have to press F9, F10 or F12 or p on boot up to present a device boot options like USB or CD/DVD
*disable the Fast Boot config so it would recognize portable DVD-drive and changed the Boot-sequence
Secure boot was introduced by Microsoft and later consortium, control what operating systems work with Secure Boot via shims.
For Aros, it is best to disable and save the turn off change to Secure Boot (if you dual boot with Windows this will cause issues with further Window boots)
For the best experience, it is advised to install to another SSD than the one Windows resides on.
The grub part of the boot should be fully automatic, and you should see a multiple choice graphic card screen after 10 seconds for USB or 40 seconds CDs and DVDs.
If boot does not occur within a minute, please reboot and choose the VGA boot option as it relays a message stream so you can see where the issue lies.
After the grub graphics choice, AROS takes over the booting and any issues can arise here
If possible please use a branded usb pen drive as most of the time when we get reports of "crashes right after grub boot selection" it is mostly due to the recorded pendrive as they are made, notoriously on a will it work / will it fail nature, every time it is used.
<pre>
So one usb drive written may stop at a System halted. Reset the machine.
Or another pendrive will show give errors Smart Filesystem request - Volume 'Aros Live Drive' (DU0: usbscsi.device unit 0) There was an error while accessing this volume:
Or if a FAT32 partition present - FAT filesystem - Device USBSCSI0P1 has a read error on block xxxxxxxx -
</pre>
Sadly, no drive even branded are resistant or totally reliable, so the only solution is to try another pendrive, and possibly to repeat, until no errors.
It will give an indication on how reliable the usb drive could be.
=====Advice for various machines=====
Some of the stages involved and shown on the display in a typical AROS boot start up
<pre>
[MultiLoader]
[ELF Loader]
[Boot]
[HPET]
[Kernel:ACPI]
[Kernel:APIC-IA32]
[Kernel:SMP APIC]
[HiddStorage]
ACPI: ????
ACPI Error
[ACPI]AcpiOs????
[BattClock] Got RTC century offset 0x32 from ACPI
[PCI] Scanning bus ?
[AHCI] Sata
[Vesa] only if vesa is chosen as graphics option
[ATA] detect hd & cd drives
[ATA0?] ata-identity
[packet] fat.handler be.handler, etc.
[DOS]
[Storage:Bus]
[Storage:Controller]
[MSS] USB setup
[ehciInit] Port ? maps to controller ?
[I2C]
[ATI]
[drm] nouveau
[AROSTCP] if you have network driver prefs set up to start when booting
</pre>
; If boot fails, please give us some indication (pictures or videos) where the boot stops and the message(s) on screen.
AROS's native SATA/AHCI driver doesn't always work. If you get errors related to ahci.device, try disabling it. At your chosen boot entry in the GRUB menu, Press E, scroll down to the ahci.device entry, and add a # or ; at the start of that line or delete it with Ctrl-K. Then press Ctrl-X or F10 to boot.
If your disk isn't accessible at all with this change, you might need to change the SATA controller to IDE legacy mode in the BIOS: however, making this change will likely cause problems booting Windows on the same machine (if it's already installed). To disable ahci.device permanently, edit the text file "SYS:Arch/pc/grub/grub.cfg", and remove the ahci.device line from all boot entries you intend to use.
SATA AHCI Timeout while waiting for device to complete operations with BIOS SATA entry set to AHCI mode stops at "waiting for bootable media" screen, changing BIOS SATA setting back to IDE mode may allow it to continue booting
The ATA driver doesn't always work. If you get errors related to ata.device, try using the alternative in sys:devs/alt which is an older version. Press E when your chosen boot entry is highlighted in the GRUB menu, scroll down to the ata.device entry, and change it to read "module /Devs/Alt/ata.device". Then press Ctrl-X to boot. To make this change permanent, edit the text file "SYS:Arch/pc/grub/grub.cfg", and change the path to ata.device in all boot entries you intend to use.
Further options (removing the " ") to add to the GRUB menus to disable certain other components for debugging:
<pre>
Disable AHCI "AHCI=disable"
Disable NVME "NVME=disable"
Disable ATA: "ATA=disable"
Disable ATA: "ATA=nopci,nolegacy"
ATA safe mode: "ATA=nodma,32bit"
Disable IDE from SATA: "ATA=32bit,nosata2pata"
VIA / SIS with cdrom read io errors "ATA=nodma,nopoll"
noacpi all [PCI] devices to be invisible to AROS. disk drives work but network, sound won't
acpi=strict if there are issues with sound after boot
noioapic alternative to no acpi
Set AHCI "AHCI=force150/force300/force600"
Disable AHCI/SATA: comment out with a # ; or remove ahci.device line with Ctrl-K
Disable USB: comment out # ; or remove pciusb.device and poseidon.library lines with Ctrl-K
Disable native graphics: "nomonitors"
USB3 "USB=xhci"
</pre>
Other useful grub command line options - nomonitors, noacpi, vesahack, nopoll
Press Ctrl and X together (or F10) to exit and boot with the new options. Just experiment with different variations until successful. Those working options will need to be reused with every reboot of AROS until you can edit the grub.cfg and make it permanent i.e. install to hard disk or USB.
* If you use VESA mode, you can see the debug log if you add 'vesahack' to the command line. This will set up split-screen mode. In the upper half you'll see AROS screen, in the bottom - debug log.
* ACPI ie. PCI hardware - If you get crashes at early boot, try adding 'NOACPI' to the command line
If you're having boot issues and have a null modem cable and a spare pc, a boot log is always useful. Edit your grub line to include debug=serial but would try with an with sysdebug=all in the line later as it can cause issues booting on machines with sysdebug=all enabled (corrupts the cpu initialization).
However, if you feel you have found a genuine bug/fault in AROS that needs attention, please use the [http://sourceforge.net/tracker/?atid=439463&group_id=43586&func=browse bug submission form] to record as much information about what happened, why, and what hardware etc. you have so that people may try to assist you
For Virtual machines VMWare VirtualBox, etc., attach and press play to start the ISO image
If booting hasn't worked then it could be down to Bios/UEFI settings
=====nvme.device=====
Since 2018, nvme drives are standard on most machines
The requirement is that a PC can boot with legacy mode/BIOS at the moment - Now as far as hardware goes on a newer machine with an NVME drive you may need to add NVME=disable as the NVME driver could potentially cause lockups.
This is still in testing and its' use should not be on or near precious own data
=====AHCI=====
Starting taking over since 2011 on a lot of machines
* Check that UEFI (replacement for PC BIOS) has options set to remove UEFI SecureBoot option and apply CSM
* SATA drive is set for Legacy or a mixture AHCI/IDE and not AHCI
AHCI sata can be very difficult to get working
Most Windows installs are already set to AHCI sata, changing this to a legacy IDE mode setting can help but please check if Windows will still boot. Some hardware like Lenovo laptops do not always like being set in legacy mode so only use as a last resort and aware of issues that can be caused.
Now as far as hardware goes on a newer machine with an NVME drive you may need to add NVME=disable as the NVME driver could potentially cause lockups.
With a 16C/32T chip machine, disable SMT and it should boot.
=====ata.device for old BIOS's =====
Pre 2010 this was the de facto standard method of providing settings to the computer at a lower level
Some adjustments to the BIOS setup options are necessary (usually by pressing a key like DEL, F1, F2, F12 or ESC, p on the very early boot up of the computer).
*Adjust booting options like moving USB hdd, CDROM higher as it is quite often disabled or placed lower by default, i.e. USB hdd, CD/DVD are placed at the top above the hard drive. Try looking here [http://www.windowsreinstall.com/articles/bios/ Windows] or [http://www.hiren.info/pages/bios-boot-cdrom Bios] or [http://www.wikihow.com/Set-Bios-to-Boot-from-a-CD-ROM Boot] or web search "BIOS BOOT CDROM"
* At the '''SAME''' time, check if the SATA/AHCI option is set to Emulate or IDE Legacy, though this can have '''issues''' with any OS already on the hard disk. If in doubt, do nothing and seek advice.
* check that under BIOS settings you '''DO NOT''' have plug&play OS selected as Aros at this point is unable to route interrupts on its own and needs the BIOS to do that.
'''Save''' options changed at the end.
PCITool can show if the motherboard chipset is in IDE mode.
Class = 0x01 means STORAGE, Subclass = 0x01 means IDE. Also ProductID 0x3a20 resolves to non-AHCI mode in Intel ICH10 documentation.
==Installing==
We have a separate section [https://en.wikibooks.org/wiki/Aros/Platforms/x86_installing here]
We have a specific section for each CPU platform under the Specific platforms in the NavBar navigation bar on the right hand side menu
error code (-6) when using the ahci.device (has writing to disk problem but not reading) is enabled. change this line in your grub and reboot
<pre>
#module /Devs/ahci.device << disable
module /Devs/Alt/ata.device << add this line instead
</pre>
==File structure overview==
AROS' directory structure is mostly identical to AmigaOS directory structure, with some additions.
AROS: or SYS: also known as DH0: (i.e. the drive partition with AROS system) has the following simplified list of the main drawers (Amigas term for directories/folders).
{| class="wikitable"
|boot:
| grub bootloader
|----
|C:
| small apps, where AROS looks first for applications/games but will look at Tools, System afterwards
|----
|Classes:
| .class
|----
|Devs:
| .device .resource and in their own drawers (folders) .audio, .hidd, network, graphics
|----
|L:
| where .handler files go
|----
|Libs:
| where .library files go
|----
|Prefs:
| applications that adjust or setup AROS functions and capabilities
|----
|S:
| startup scripts (for the aros boot process '''not''' grub) are stored here
|----
|Storage:
| place to keep old or alternative device drivers
|----
|System:
| applications associated with AROS operating system
|----
|Tools:
| extra applications
|----
|Utilities:
| extra applications
|----
|WBStartup:
| copy applications here to autostart with needed icons, drawers, data etc
|----
|}
See [[Aros/User/DOS#Drives.2C_Files.2C_Assigns.2C_Directories|DOS manual: Drives, Files, Assigns, Directories]]
=== Filesystem ===
Whilst the kernel is the heart, the filesystem is the blood of the system they are split into two categories (only a few are supported)
<pre>
Journalling - SFS PFS3 but also NTFS ZFS XFS ext4
Non-journaling - FFS FAT32(VFAT) but also exFAT BtrFS ext2
</pre>
Filesystem options for AROS to install
* SFS default
* Professional File System PFS3 [http://eab.abime.net/showthread.php?t=52234&highlight=pfs3+free&page=13 only on motorola 68k at the moment]
* FFS very old now but left in for legacy usage
Other [https://archives.arosworld.org/index.php?function=browse&cat=driver/filesystem filesystems] for storage purposes
* FAT32 favorite as most OSs support
* NTFS (can lock AROS)
* exFAT
The only filesystems that really NEED defragging (i.e. disk tidy up) are from Microsoft(TM) - exFAT/VFAT/NTFS
*SFS tries to do exactly the same thing, but in certain cases it doesn't do as well as PFS. But you can defrag SFS
*PFS *minimises* the amount of fragmentation, but does not automatically defrags as it saves files to the drive
The setup of the below filesystems is usually done by the distro maintainer but if not....
<pre>
Copy L/exfat-handler L:
DOSDriver or Mountlist entry for an exFAT partition make sure that the FileSystem and Handler are set as follows:
FileSystem = exfat-handler
DosType = 0x46415458
</pre>
<pre>
Copy L/ntfs3g-handler L:
DOSDriver or Mountlist entry for an NTFS partition make sure that the FileSystem and Handler are set as follows:
FileSystem = ntfs3g-handler
DosType = 0x4e544653
Also to make a read-only mount you can set:
Control = ro
</pre>
The Smart File System (SFS) is a journaling filesystem used on Amiga computers and AmigaOS-derived operating systems. It is designed for performance, scalability and integrity, offering improvements over standard Amiga filesystems as well as some special or unique features.
SFS is written in C and was originally created and released as freeware in 1998 by John Hendrikx. After the original author left the Amiga scene in 2000, the source code to SFS was released and its development continued by Ralph Schmidt in MorphOS.
Its development has now forked; as well as the original Amiga version, there are now versions for MorphOS, AROS, AmigaOS 3, and a version for AmigaOS 4, which have different feature sets but remain compatible to each other. Versions for AROS, AmigaOS and MorphOS are based on different branches.
In addition, there is a driver for Linux to read Amiga SFS volumes, GRUB natively supports it and there are free drivers to use it from UEFI. The Linux version is [http://home.elka.pw.edu.pl/~mszyprow/programy/asfs/ independent code].
SFS (Smart File System) partially defragments itself while the filesystem is in use. The defragmentation process is almost completely stateless
AROS SFS version has a 120GB partition size limit on hard disks and DVDs current 4gig size limit.
The sources for the MorphOS 64-bit version of SFS were available but no porting to AROS has happened so far due to endian issues, etc.
SFS Tools
* GUI - arSFSDoctor,
* CLI - sfscheck , [http://www.portacall.org/ sfsundelete], sfsformat, setcache hits a usability ceiling around the 10GB / 100,000 file mark,
sfscheck dh0: seek purge fraglist defragment
If there are two simultaneous file writes in progress and you reboot machine (or it locks up or crashes) you may end up with a corrupted filesystem. Although arSFSDoctor may help, you might have to copy the files to another partition, format the partition with the errors on and copy the files back.
PFS / SFS are way more advanced and much much faster than the FFS. FFS is supported for legacy reasons only.
The Professional File System (PFS) is a filesystem originally developed commercially for the Amiga and now distributed on Aminet with a 4-clause BSD license. It is a compatible successor of AmiFileSafe (AFS), with an emphasis on added reliability and speed compared to standard Amiga filesystems. It also features multi-user abilities like the older MuFS.
PFS has so many advantages including the important things, speed, the ability to recover all deleted files even simply same name by typing the command ". Deldir" convenient if done in Directory Opus, virtually deleted files are copied normally as if they had never been deleted, other convenience is to not ever invalidate the filesystem, just put it on top of the startup-sequence command "diskvalid", which automatically corrects any irregularities in the system startup; PFS also provides a device for floppy which makes them very fast and takes advantage of the full capacity of the floppy including the area dedicated to the bootloader.
The device is split into two main areas. At the beginning of the device is the metadata section, which consists of a root block, and a generic array of blocks that can be allocated to store metadata. The rest of the device is another contiguous generic array of blocks that can be allocated to store data. The metadata section usually uses a few percent of the device, depending on the size of the device.
The metadata is stored as a tree of single blocks in the metadata section. The entire directory structure is recorded in the metadata, so the data section purely contains data from files. The metadata describes the location of data in files with extents of blocks, which makes the metadata quite compact.
When a metadata update occurs, the system looks at the block containing the metadata to be changed, and copies it to a newly allocated block from the metadata section, with the change made, then it recursively changes the metadata in the block that points to that block in the same way. This way, eventually the root block needs to be changed, which causes the atomic metadata update.
The filesystem is reasonably good at keeping files unfragmented, although there is a defragmentation tool available which will work on an online filesystem ie whilst being used.
It was the first filesystem to introduce the concept of the Recycle Bin natively at filesystem-level to the Amiga, holding the last few deleted files in a hidden directory on the disk root.
PFS version 5.3 was developed in C and a small portion of assembly code by Michiel Pelt. There are endian issues to be overcome and adapting the small amount of m68k to C before use on intel based machines, etc.
Autoupdate of files in a directory is already implemented in Wanderer, but not all file systems handle dos.library/StartNotify() in its full extent. It seems to work correctly in Ram Disk (thanks to AmberRAM handler), and it also works on SFS formatted devices. Other file systems might not yet have it implemented correctly though.
The PC equivalent of the Amiga's RDB is the master boot record (MBR).
===Installing Applications===
The typical means to install applications under AROS/AmigaOS involves simply copying/extracting the archive (.zip .lha .rar .tar.gz) file containing the applications files to your own desired location i.e. drawer/folder. Once extracted, launching it by double clicking on an icon (recommended) or using the shell (alternative). Generally, this is on a separate partition from your AROS system files, however in reality it can be any location - including RAM: if you don't want it staying around too long especially when you switch off.
At some time in the future it may be desirable for AROS to have a package-manager like subsystem able to retrieve information online about packages available for AROS and whether they update anything you currently have installed, however at the moment no such ability exists.
===User Data files===
AmigaOS has no notion of a default location to store user data files, and presently neither does AROS - though it may be desirable at some time to provide a common start location.
Some people, have extra small FAT32 partition(s) using HDToolbox, and not Qparted, to store data especially if a reinstall is ever needed. And then setup the usual Sys: (DH0:) and Work: (DH1:) / Briefcase (DU1:) partitions.
===User Environment configuration files===
AmigaOS/AROS stores persistent system configuration data in directory assigned to ENVARC:. This, by default, points to SYS:Prefs/EnvArc.
During boot a copy is made to another assign, ENV:, which is for runtime usage. Changes to the files here will not survive a reboot.
Setting the env variables is generally done by applications themselves, or when necessary by the user using the SetEnv command. SetEnv has a SAVE switch to force the persistent copy in ENVARC: to be written also for when you are sure the change should be permanent.
Under the standard installation of AmigaOS style OSs, ENVARC: is copied to ENV: upon startup, which, if you have a hard drive installation, is in RAM:, hence, ENV: ends up being RAM:Env.
ENVARC: is the Environment Archive, which is the permanent copy of ENV:, which is the Environment. It's roughly like the Registry in Windoze.
Most programs do (and all should) store their settings in ENVARC: somewhere, and load them from ENV:. The effect of this can be seen in the Preference editors. If you Save your preferences, they go in ENVARC: and ENV:. If you click Use, they only go in ENV:. If you reboot, normally, anything saved to ENV: is lost, and is replaced with a copy of what is in ENVARC:.
you can set the default public screen for any tool started from a cli with the PUBSCREEN variable. So open the pubscreen, set PUBSCREEN to the name and start newcli for example, then the new cli window (and all following windows opened from that window) will appear on that public screen.
===Drivers===
For certain hardware, e.g audio, networking and , there is no auto setup. Just like the original Amiga OS.
For audio, use AHI in the Prefs folder to set Music and at least Unit 0 with the appropriate driver and press Save. For ethernet and wifi, please use SYS:Prefs/Network
All hardware support is placed in the Devs drawer (folder/directory). The network drivers <something.device> go in the Networks sub-drawer. Audio drivers <something.audio> are put in the AHI sub-drawer. Graphics drivers <something.hidd> are put in the Drivers sub-drawer.
==Configuring==
AROS has mainly decided on a MUI-like requester&menu clone called Zune so changing the background, icons, font, menus can be done with SYS:Prefs/Zune
AROS has several desktop GUI front ends like
* DOpus5 Magellan II, Wanderer and Scalos (medium)
* AROS Workbench, Workbook (smaller)
File / Directory managers like Dopus4, MCAmiga,
App Launch Shortcuts like FKey, BoingIconBar, right mouse click on magellan, wanderer desktop, Amistart, etc.
General usability decisions - Prefs/IControl, Prefs/Locale, Prefs/Input, Prefs/Fonts,
Select an icon with left mouse button and then right click the mouse button and selecting Icon -> Information gains access to the tooltypes tab where information can be edited
CLI in icon's tooltypes means 'run it as if it was run from shell'
If, on the other hand, the WB parameter (or no parameter) is present in Tooltypes, Wanderer will execute the binary and, if provided, the options included in Tooltypes.
WBxCLI is very useful for adding options to DOS Commands.
Important: AROS has a different way of managing icons. If you have an executable file, you will never be able to add a project icon. AROS will automatically recognise that it is an executable file and will transform the icon into a tool icon.
Icons are typically now .png pictures renamed as .info e.g. so Office application name would have a Office.png renamed as Office.info or MyApp.png as MyApp.info, etc.
Leave Out menu option to leave app icon on desktop
To select multiple icons and save their positions, click on the first icon and after while you hold the Shift key down select further icons and don't release it before SnapShot is finished. You can also select a whole group of icons by pressing the LMB at the top left of the icons and while keeping the LMB down moving the power towards the bottom right. A expanding bounding box will appear and all the icons within it will be selected.
Clean Up menu option (right mouse button -> Icons) rearranges icons in a drawer or disk window into a neater condition. To use, open the window to rearrange and select Clean Up. To keep the icons in the new positions, select all the icons (shift key or mouse selection) and select 'Snapshot' and then Window and then again with All.
In DOpus5, Scalos, wanderer, most files have an icon file associated with it. To change the default tool, select Icon menu, Information, and change the default tool string. For example, you could use Multiview, Editor and so on for most text, graphics and some sound files as long as the appropriate Datatype classes are installed. For scripts, set the tool to C:IconX
We have new Icon edit tools in progress but if you need to...
C:Join Image1.png Image2.png TO MyFile.info
is enough to make a dual state icon from two png images. You can then use Wanderer's menu Icon/Information on it to edit its fields and tooltypes.
[https://archives.arosworld.org/index.php?function=browse&cat=graphics/icon AISS toolbar images] unpack unarc them into RAM: and copy Images directory to SYS:Prefs/Presets/ AISS icons are looked for in PROGDIR:, PROGDIR:Images, SYS:Prefs/Presets/Images and then in TBImages: according to Open Amiga guidelines.
there is Demos/iconscale which could be launched from S:User-Startup with two arguments, telling it the horizontal and vertical size. IE something like
Demos/iconscale 40 40
It will shrink icons... not sure if it will be very nice though. it doesn't work for the icons on the main desktop.
there is an option to scale an icon to a bounding box afair, try iconsize followed by two numbers, like:
iconsize 32 32
Is there any way in AROS to change an icon type from Project to Tool or vice versa?
Either the SIT option of [ ProcessIcon], or the TYPE option of HandleInfo (not sure if this one works at all, please test with care).
processicon sys:pathoftheicon SIT=Project
SIT Set type of ICON. Allowed types are: "Disk", "Drawer", "Tool", "Project", "Garbage", "Device", "Kick" and "AppIcon".
Btw, are your icons, the #?.info files, writable, is the W flag set ?
'''Decoration''' is Aros' way to provides a way to hide the old Workbench 3.1 style of windows and screens. In Prefs/Appearance some decorative theming elements need work
Themes - SYS:Prefs -> Appearance
The default content of Prefs/Env-Archive/SYS/themes.var should be "themes:ice" but can be changed via the Appearance prefs, please do NOT click the Use button. Its useless. As you know, it will ask for the theme volume. Just pick the theme you want, click on Save, then reboot.
* Decoration is on. Any time trying to change theme, you get: "Please insert volume Theme: in any drive"?
You could check if you find SYS:System/Themes or if it is missing. Then you could open startup-sequence which you can find in drawer "S". There should be a line:
Assign THEMES: SYS:SYSTEM/THEMES >Nil:
This does the trick.
Open a shell and run:
Assign THEMES: SYS:SYSTEM/THEMES
Than start the Theme prefs again... this should work
* The theme is the only thing that could slow the system a bit, but it's not that performance impacting on most uses, and you can switch it off completely. Remove C:Decoration from the bottom of the file sys:s/startup-sequence.
In each theme directory is
*Env-Archive -> Zune -> global.prefs
*images -> Gadgets -> 20x20 pngs for Down etc
*menu -AmigaKey - Background - Checkmark - SubMenu and config
*system - Arrowdown, Arrowleft, Arrowright, Arrowup, etc
There is an [https://archives.arosworld.org/index.php?function=browse&cat=graphics/theme ALua/Zulu script] built for faster Wanderer skin management. You can modify config files, install new (wdz format/zipped skin files) and delete skins via the Theme Manager. This has not been updated in a long time and may not work.
Exchange controls Commodities and can be opened with alt, ctrl, h
Certain features are added if from Tools/Commodities like Blanker screensaver, ClickToFront and DepthMenu with .info icons are selected and dragged to /WBStartup folder
Most apps can be autostarted by copying into SYS:WBStartup directory folder
e.g. WeatherBar.zip can be downloaded, unzip and the contents of the zip copied to wbstartup folder
ClicktoFront and .info to SYS:WBStartup so always be activated when turning on the computer
or add a text line to user-startup is SYS:S (scripts version of wbstartup)
e.g. standard Amiga / AROS does not allow clicking of background windows to come to the front to make it easy to get to the window you need but it has the ability if these apps are copied again to WBStartUp or are added to SYS:S/user-startup script
run QUIET sys:Tools/Commodities/ClickToFront >Nil:
run QUIET sys:Tools/Commodities/DepthMenu >Nil:
run QUIET sys:Tools/Commodities/Blanker seconds=300 >Nil:
*AltKeyQ uses left Alt key to add strange letters
*AutoPoint
*Blanker screensaver
*ClickToFront allows windows to be easily brought to the front
*DepthMenu adds menu to select window easily
*NoCapsKey
*Opaque
*FKey - Although there are heaps of docks, menus and other launcher programs on the Amiga like OSs, FKey has got to be one of the quickest once learnt ways to launch programs, and it comes with the OS. In SYS:Tools/Commodities, the FKey commodity (Ctrl Alt F) allows you to make actions assigned to some combinations of keys
<pre>
ALT TAB Cycle Windows
Cycle Screens
Enlarge Window
Shrink Window
Toggle Window Size
Insert Text
Run Program
Run Arexx Script
</pre>
e.g.
<pre>
LAmiga F1 = Avail Flush
LAmiga F2 = Open Prefs
LAmiga F3 = Finder
Alt Tab = Cycle Windows
LAmiga Tab or M = Cycle Screens
Alt Up arrow = Enlarge Window
Alt Down arrow = Shrink Window
Alt Home = Toggle Window Size
= Insert Text
LAmiga e = Run Program
= Run Arexx Script
</pre>
If your FKey GUI pops up when you start your Workbench up and you don't want it to, click once on the icon, go to the Icons-Information in the menu and make sure it has the tooltype set "CX_POPUP=NO".
Now let's launch it and assign the locale switching. After you double-click on FKey icon, launch the Exchange, choose the FKey from list and click the Show button. This will invoke the FKey window. You can see the ALT TAB in list assigned to window switching. Now enter the first key combination, say, ALT Z and go to the right panel. Choose Launch the program from pulldown menu and enter SYS:Prefs/Input as an argument. Append the USE switch and english preset name to the string as shown:
SYS:Prefs/Input USE SYS:Prefs/Presets/english
Click on the New Button to add the another combination. Now set the combination for your locale as shown above, replacing English name with your preset name. Click New button again and then Save Settings. Now you can use defined combinations to switch the layouts.
There is a system wide ARexx script capability (based on regina) that can manage many file manipulation task(s) but this would work only with those program that support [https://en.wikibooks.org/wiki/Aros/Developer/Docs/Rexx ARexx] like
*Desktop - DOpus5, Scalos
*Dock - FKey,
*Files - Multiview, DOpus4,
*Internet Apps - Odyssey, WookieChat,
*General Apps -
the shell can be modified with escape strings but not needed in most cases
Common Keyboard Shortcuts
<pre>
RAlt Right Alt Key
LAlt Left Alt Key
RWinKey Right Windows Key
LWinKey Left Windows Key
RAmiga Right Amiga Key (if one)
LAmiga Left Amiga Key (if one)
</pre>
;Bootup Options
:Spacebar during boot, enters the bootmenu which allows a boot without startup sequence, etc
;Left Click
:LAmiga = LWinKey = F11
;Right Click
:RAmiga = Help = F12
;Mark
:RAmiga and B
;Cut
:RAmiga and X
;Copy
:RAmiga and C
;Paste
:RAmiga and V
;Search
:RAmiga and S
;Mouse Movement
LAmiga and together with arrow keys - shift as well at the same time as well to move faster
;Mouse Selection
LAmiga and LAlt to select
;Screen Switching
LAmiga and M or N
;HELP key
Can sometimes be mapped to F11 but can be changed via FKey
ComKeyRemapper or AmigaKeyremapper could swap RAmiga to another key press
===DOpus 5 Directory Opus Magellan II===
Dopus 5.x is a whole desktop replacement on the Amiga Workbench (Desktop)
DirectoryOpus app will assign DOpus5: to it's PROGDIR: automatically but if not add the below (edit SYS:System to suit where Dopus5 was installed) to your startup-sequence
<pre>
Assign DOpus5: SYS:System/DOpus5
DOpus5:DirectoryOpus
;DOpus5:C/LoadDB
</pre>
Left mouse button clicked twice on the desktop background brings up the Device List window.
Green strip notifies SRCE (source) and if another is open it will be red for DEST (destination). clicking on the red strip changes to green
Word list of actions with a left mouse click on the DOWN Arrow and directory stuff with < button which mirrors the icons at the top of each lister
single-key hotkeys? exactly the same as in dopus4, edit your functions (button bank, toolbar, menus etc.) and under the flags gadget is a key gadget, just click in it and press the key you want to use.
As for the extra text field... try turning off Extended lister key selection in environment / miscellaneous.
Shift and click on the icon - runs the icon
DOpus5 Magellan 2 Directory folder drawer structure
<pre>
ARexx - Arexx scripts .rexx and .dopus5 to perform tasks
Buttons -
Commands -
Desktop -
Environment - two environment files bundled:
default gets loaded if you run DOpus as a normal app
workbench gets loaded if you run DOpus as a WB Replacement (with LoadDB on startup)
Filetypes -
Groups -
Icons -
Images -
Modules - compiled tasks
Settings -
Sounds -
Themes -
WBStartup - Use this if standard SYS:WBStartup gives cannot wait error messages
</pre>
Settings -> Environment -> Display -> Workbench (Use)
*Settings -> Clock (add to title bar as well as the date)
*Toolbar -> Editor (Right Win Key together with 1) for Copy, Move, Delete, etc above the Device List
*Menu -> (Right Win Key together with 2)
*Buttons -> Editor (Right Win Key together with 3)
*Settings -> Environment (Right Win key together with 4) for Backgrounds, etc
*File Types -> (Right Win key together with 5)
*User Menus -> (Right Win key together with 6)
*Hotkeys -> Setup for quick shortcut keypresses (Right Win Key together with 7)
*Scripts -> (Right Win key together with 8)
*Icon Positioning -> (Right Win key together with 9)
Each Dopus5 theme are stored in a separate directory, named appropriately, which contains further sub directories
* Font (amiga bitmap fonts)
* Screens (jpg or any picture supported by datatypes but not animations)
* Sounds (wav but not iff 8svx )
* Icons (png newicons glowicons )
* Patterns (iff jpg png )
Just use wildcards in background filenames and you get a different picture every reboot
For example, configure in Environment -> Backgrounds -> Desktop something like this:
<pre>
Work:Pictures/Backgrounds/#?
...or
Work:Pictures/back#?.iff
...etc...
</pre>
[https://aminet.net/util/dopus arcdir and themes]
If you want to change the backdrop pic after a period of time, paste below into a text file called dopusrandbg.rexx and place in DOPus5:ARexx
<pre>
/* Changes DOpus background image forever
Start with:
Run >NIL: RX dopusrandbg.rexx
*/
if ~show("L", "rexxsupport.library") then do
if ~addlib("rexxsupport.library", 0, -30,0) then exit 10
end
/* Configure these two lines for your needs: */
minutes=1
picpath="Work:Pics/#?.iff"
address DOPUS.1
do forever
call delay 3000*minutes
dopus set background '"'picpath'"' desktop center custom
dopus refresh background custom
end
</pre>
If you don't want to use/open rexxsupport.library just for DELAY() then use the DOS Wait command
<pre>
/* random diropus backdrop changer */
/* by paul trauth, 1999 */
/* to do: non-repeatable randomness? */
options results
parse arg path
address DOPUS.1
/* get current backdrop pattern so it actually changes */
dopus query background desktop custom
currentpatt=result
lastslash=lastpos('/',currentpatt)
currentpatt=substr(currentpatt,lastslash+1,(pos('"',currentpatt,2)-lastslash-1))
dir=showdir(path,'FILE','/')
num=0
do while dir~=''
where=pos('/',dir)
if where>0 then do
file=left(dir,where-1)
dir=right(dir,length(dir)-where)
end
else do
file=dir
dir=''
end
if left(file,1) ~='.' & file~=currentpatt then
do
pics.num=file
num=num+1
end
end
which=random(0,num-1,time(s))
newbg='"'||path||'/'||pics.which||'"'
dopus set background newbg desktop tile precision exact
dopus set background on
dopus refresh background
</pre>
Clock format commands available are defined by locale. They are:
<pre>
%a - abbreviated weekday name
%A - weekday name
%b - abbreviated month name
%B - month name
%c - same as "%a %b %d %H:%M:%S %Y"
%d - day number with leading 0s
%D - same as "%m/%d/%y"
%e - day number with leading spaces
%h - abbreviated month name
%H - hour using 24-hour style with leading 0s
%I - hour using 12-hour style with leading 0s
%j - julian date
%m - month number with leading 0s
%M - the number of minutes with leading 0s
%p - AM or PM strings
%q - hour using 24-hour style
%Q - hour using 12-hour style
%r - same as "%I:%M:%S %p"
%R - same as "%H:%M"
%S - number of seconds with leadings 0s
%T - same as "%H:%M:%S"
%U - week number, taking Sunday as first day of week
%w - weekday number
%W - week number, taking Monday as first day of week
%x - same as "%m/%d/%y"
%X - same as "%H:%M:%S"
%y - year using two digits with leading 0s
%Y - year using four digits with leading 0s
</pre>
like %a %d-%b-%y %H:%M or
A WB ARexx interface, you could enter a cli command as a menu item to open a WB drawer like this...
RX "address WORKBENCH;WINDOW 'device:drawer' OPEN"
Where device:drawer is replaced by the path of the drawer to open.
The ARexx script would be capable to manage such a task but this would work only with those program that support ARexx
<pre>
dopus addappicon
dopus addtrap
dopus back
dopus checkdesktop
dopus clear
dopus command
dopus desktoppopup
dopus error
dopus front
dopus getdesktop
dopus getfiletype
dopus getstring
dopus matchdesktop
dopus progress
dopus query background, font, palette, pens
dopus read
dopus refresh all, background, icons, lister
dopus remappicon
dopus remtrap
dopus request
dopus script
dopus screen
dopus send
dopus set background, font, palette, pens
dopus setappicon
dopus version
</pre>
<pre>
lister add
lister addstem
lister copy
lister clear value
lister clearcaches
lister close
lister empty
lister findcache
lister getstring
lister iconify
lister new
lister query active all, dest source
lister query abort, busy, case, dirs, display, entries, entry, files, flags, handler, header, hide
lister query label, lock, mode, namelength, numdirs, numentries, numfiles, numseldirs, numselfiles
lister query path, proc, position, seldirs, selentries, selfiles, separate, show, sort,
lister query title, toolbar, value, visible, window
lister read
lister refresh
lister reload
lister remove
lister request
lister set busy, case, dest, display, field, flags, handler, header, hide, label, lock, mode
lister set namelength, newprogress, off, path, position, progress, separate, show, sort, source
lister set title, toolbar, value, variable
lister select
lister wait
</pre>
The '''command''' allows you to call internal DOpus commands from an ARexx script
<pre>
command all
command wait copy
command read s:startup-sequence
command source 12345 makedir name noicon
</pre>
*SFTP secure encrypted comms over internet using libssh2 and zlib (different protocol to the two below) on port 22
*FTPS secured with https like security on port 21
*FTP not secure and unencrypted protocol over internet on port 21 (should not be used today on the internet but for your own server)
===Wanderer ===
Wanderer prefs in the prefs drawer - Appearance tab and Workbench icon allows backgrounds (wallpapers) icon text sizes, colors, etc but cannot use #? or *.* in the backgrounds file entry to randomly choose pictures - [https://developers.google.com/speed/webp/docs/riff_container webp riff container] issues with this format but Multiview has none.
Enable the bar, you need to edit the text file ‘statusbar.prefs’. The change is simple: just change “False” to ‘True’.
Prefs/Env-Archive/SYS/Wanderer/statusbar.prefs
===Scalos===
[https://web.archive.org/web/20180922220139/http://scalos.noname.fr/ Scalos] is not an OS replacement, it's a Workbench replacement. It replaces the desktop and graphical file management components.
Scalos is 100% Workbench replacement with most functions working like the original Workbench ones. Undo and Redo available for most window and icon operations. Fully multitasking so every window has its own task. While loading icons, any window function (e.g. Drag&Drop) is available.
24bit color support with window patterns - Unlimited and easily configurable via tooltypes. Optimised backgroundpatterns routine so patterns can be tiled, centred or even scaled to fit into the windows. Live updating window scrolling - Supports middle mouse button panning and drawer (folder) windows can be iconified on the desktop.
Icon imagetypes with all types are supported such as backfill or complement. Configurable surrounding iconborder. Icon support also visually highlights files which are soft-links in the file system. Icon dragging is more stable and far less flickery on graphics cards. Whilst dragging, icons are displayed with text and they can become transparent over anything where they can be dropped.
Single-window lasso mode, with scrolling window contents invoked by dragging mouse with configurable qualifier key. Text icon lasso selection used to ignore "Name column selects text icons" flag. Support for backfilled thumbnail icons, with selectable color and transparency. Added option to always generate square thumbnail icons with preview icons for images - Thumbnails can be permanently saved in icons.
Supports PNG icons with alpha channel and real transparency and displays OS3.5 GlowIcons and are all scalable. Iconborders with variations (normal, shadowed, outlined).
Completely configurable, filetype-specific user-definable popup menus and tooltips. Plugin system to exchange or add features and can enhance the Workbench and make it more configurable.
Filetype plugins to display filetype-specific information. - Currently, EXIF information viewer for JPEG images is included. Plugin included for 100% support of OS3.9 Workbench features. Plugin included for AREXX API compatible to OS3.9 Workbench.
Online update with updater.module
Scalos works also as a Workbench replacement. In this case the 'emulation mode' has to be set by using Scalos' own version of LoadWB and offers
* Scalos uses the Workbench Screen for its windows instead opening a new one
* AppIcon, AppMenuItem, AppWindow functions are redirected to Scalos
* all Programs placed in "WBStartup" should start
* The Screen will be reopened in case of changes in ScreenMode and Palette settings
<pre>
v1.0 (V39.201) - November 1999
v1.1 (V39.212) - December 1999
v1.2b (39.220) - June 6, 2000
v1.2d (39.222) - 2000 (latest public beta executable)
v1.3 (40.7) (beta) - August 2, 2001
v1.3 (40.22) - September 25, 2002
v1.4 (40.32) (beta) March 31, 2005
v1.6 (41.4) - March 27, 2007
v1.7 (41.5) - August 12, 2007
v1.8 (41.6) - March 12, 2009
v1.9 (41.7) (beta) - March 15, 2010
v1.9 (41.8) (RC1) - August 25, 2012 open source
v1.9.2 (41.10) Deadwoods' AROS late 2022 32bit and 64bit build unifying the code base of ` for AROS x86 ABIv0, AROS x86_64 ABIv11 and AROS m68k
</pre>
Distros may have Scalos files under SYS:System/Scalos or Extras:Scalos. Known [https://github.com/deadwood2/AROS/issues/75 bug list],
Certain files like Menu13.prefs, Palette13.prefs, Pattern.prefs and scalos.prefs need to be in SYS:Prefs/Env-Archive/Scalos they can be found in Scalos:Storage/envarc and country drawer
or run the "Scalos Menu" preferences program. Note if already setup with sub-menu entries and then re-save your menu prefs as it will now generate a new/overwrite prefs file called "Menu13.prefs" in "envarc:scalos/". The same is also required for the new Palette prefs update, click 'Save' and a "Palette13.prefs" file will be saved in to "envarc:scalos/" directory.
<pre>
ASSIGN Scalos: SYS:xxx/xxx DEFER
ASSIGN Libs: Scalos:Libs add
;ASSIGN SYS:Devs/Datatypes Scalos:Devs/Datatypes add
Assign Theme: Scalos:Themes/Default_Theme add
Assign Locale: Scalos:Locale add
Protect Scalos:Tools/browse.script s add quiet
Protect Scalos:Tools/OpenShell s add quiet
Protect Scalos:Tools/run.script s add quiet
run Scalos:Tools/LoadWB
;Scalos:Scalos
</pre>
Add the above to SYS:S/startup-sequence or SYS:S/user-startup '''before any Wanderer entries'''
In the prefs drawer (folder) is the big prefs app Scalos_Prefs which covers these user setup areas
<pre>
About Scalos
Paths - should be preset
Startup - WBStartup drawer contents should auto run on each startup
Desktop - edit titlebar, icon layout and in misc, auto leave-out (drag icon to desktop)
Icons -
Drag and Drop -
Windows -
Text Windows - in misc, drawer sorting at start of listing if needed
TrueType Fonts - use Truetype fonts rather than system ones
Miscellaneous -
Plugins - after adding oop/title_clock.plugin %ti %da does not work, maybe needs ASCII .prefs added
Modules - ??
Menu - setup for MainMenu and PopupsMenu with New Menu, RE Name, Key: shortcut, Command Properties
FileTypes - already added def_Project icons and def_Disk (hdd sdd cd dvd etc) support
PopupMenu - tweak how popups appear
Pattern - Wallpaper backgrounds with Type DE, each pattern in the list can be edited, Save as Pattern.pre
Palette - change the color of things , Save as Palette.pre
</pre>
Scalos_Prefs - Pattern - Minimum options to be changed are
*DE Desktop/Background
*SC Screen
*TW Window/TextBackground ie Text listing showing if icon type not recognised
*IW Window/Background ie Icons showing
Workflow - In "Pattern List" tab, select New - choose a picture, highlight in list, click in number box under New button and slide to another number, click on "Defaults" tab and adjust Pattern numbers slider to choose right picture for each of the above options - Click "Pattern List" tab to check eveything is OK and click Save
Pattern List tab on Patterns Page - Allows you to compile a list of pictures (one at a time rather than a whole folder e.g. with #? or *.*), assigning a number Nr to one or more of them for easy reference. Using this number you will be able to assign the pictures to specific windows on the Defaults tab Page. If multiple pictures have the same number, one of the pictures will be chosen randomly. This will allow you to have random desktop pictures, random window backdrops etc.
Defaults tab on Patterns Page - Here you can set the defaults for the background pictures for the Desktop, Screen, Window and/or Text Mode throughout Scalos.
Randomize every time [check box] - Usually Pictures with the same number will be randomly selected as soon as the configuration loads. If this option is set, the picture will be selected as soon as a window with the same number assignment is opened.
*Fit size: The picture will be resized to the dimension of the new window.You *MUST* have set GUIGfx on. asyncron layout: Pictures will be loaded and rendered while the windows opens (Like original Workbench). If this function is 'off', pictures will always be loaded before opening the windows.
*Use friendbitmap : The picture is present twice in memory for best speed. This option has no effect if V43 picture.datatype or GUIGfx are used. Always relayout: If "Fit size" is set, the picture will be scaled everytime the window's dimensions change.
*Randomize everytime: Usually Pictures with the same number will be randomly selected as soon as the If more pictures have the same number, one of them will be chosen randomly.
Patternlist New/Delete : Add a new picture. After that you should assign a number to it. The picture will be rendered as tiles. configuration loads. If this option is set, the picture
Asyncron-Task priority: You can set the CPU priority for the Task if "asyncron layout" is set.
<pre>
Desktop: Number of the Picture for the main window.
Screen: Number of the picture for the Scalos-Screen.
Window: Number of the picture for the Scalos-windows.
TextMode: Number of the picture for the Scalos-windows in Text Mode.
</pre>
Popup Menu preferences fully configurable menus (includes ToolsDaemon and ParM launch apps import), including support for context-sensitive Popup menus configs for top pull down menus for apps, etc.
Workflow - Scalos_Prefs then Menu, New Item, New Command add name at top then in Command Properties e.g. add Workbench and location e.g. DOpus:DOpus4 for apps Command for c apps or Rexx for scripts or Plugin for or AmigaDos for modules
<pre>
DESCRIPTION NAME/A This is the title that is displayed in the top line of any popup menu
INCLUDE NAME/A Name of file to be included. Path can be relative to "Scalos:FileTypes"
POPUPMENU Starts the popup menu description section for this filetype.
</pre>
The following Subcommands are allowed inside popup menus:
<pre>
SUBMENU "NAME/A"
ENDSUBMENU
MENUENTRY "NAME/A,KEY/K,DEFAULTACTION/S"
ENDMENUENTRY
INTERNALCMD "NAME/A"
WBCMD "NAME/A,STACK/K/N,WBARGS/S,PRI=PRIORITY/K/N"
AREXXCMD "NAME/A,STACK/K/N,WBARGS/S,P=PRIORITY/K/N"
CLICMD "NAME/A,STACK/K/N,WBARGS/S,P=PRIORITY/K/N"
ICONWINDOWCMD "NAME/A"
PLUGINCMD
MENUSEPARATOR
ENDPOPUPMENU
TOOLTIP
ENDTOOLTIP
</pre>
<pre>
Starts the tooltip description section for this filetype. The following Subcommands are allowed inside popup menus:
GROUP "ORIENTATION/K"
ENDGROUP
MEMBER "HIDE/K"
ENDMEMBER
HBAR
STRING "ID/K,TEXT/K,SRC/K,TEXTPEN/K,HALIGN/K,STYLE/K,FONT/K,VALIGN/K"
SPACE "SIZE/N/A"
DTIMAGE "FILENAME/A"
</pre>
Each theme drawer (folder) has these further folders
<pre>
About -
Desktop -
FileTrans -
FileType -
Icons -
Menu -
Modules -
PointerIcons -
Prefs -
Sound -
Window -
</pre>
*Plugins
<pre>
devicefilter.plugin
persist.plugin should a crash or reboot occur - next time Scalos started, all windows re-opened
title_clock.plugin add digital clock to title see more below
title_envvar.plugin %ev, which can be used to display the value (a string) of the variable in the titlebar
title_freepens.plugin
volumegauge.plugin
wb39.plugin
wbrexx.plugin plugin adds a Workbench 3.5+ compatible AREXX interface to Scalos internals
xtwindows.plugin left or right ALT or left or right SHIFT keys when open/close windows
filetype.plugin then run FileTypes-prefs and customize the filetypes (eg import from a DefIcons-brainfile)
menu.plugin
</pre>
*Modules - delete, empty_trashcan, execute, find, format_disk, information, iconproperties, newdrawer, reboot, rename, systeminfo, windowproperties
*Tools - scripts like LoadWB, quit.rexx, open_volume.rexx,
In Scalos_Prefs->Filetype->Recognition you can define the filetypes and on "Action" you define specific context menu for all filetypes defined in recognition (similar to magellan)
there is the same you must show all first (list is only limited) so you created a file type AAABBB, you need to have def_AAABBB icon
Associating files with "Scalos_FileTypes" is very simple, practically it is very similar to Dopus4, first you create the Def_icons to assign to the file type (will be seen automatically ), then run "Scalos_FileTypes" you add the extension, fill in the descriptor (MATCH or PATTERN etc..) and save
then you create a appropriate entry in the list and rename it, if def icon exists it is shown. Below you can define how files are identified. I use "pattern", similar to magellan to identify file by ending. Then you click on the shown icon and define in it what program is used when you double-klick on it and save it. On the tab action you can define popup menu for it.
defined all archive types from XAD in "filetypes". If you change to "action" and click on "archive" you can define the context menu that is shown if you do not define a specific context menu for a filetype
Reset to Default in Scalos_Prefs resets all settings so BEWARE
<pre>
The Scalos desktop screen titlebar may be configured using the main Scalos Preference program. This oop/time_clock plugin adds some additional placeholders:
%ti, displays the current time in the default Locale format. e.g. "10:43:37"
%da, displays the date in the default Locale format. e.g. "Saturday 14 July 2001"
Using the supplied prefs program for the plugin, or editing the ASCII file ENVARC:Scalos/title_clock.prefs you can use the following standard Amiga Locale values to change the formatting
%a - abbreviated weekday name
%A - weekday name
%b - abbreviated month name
%B - month name
%c - same as "%a %b %d %H:%M:%S %Y"
%C - same as "%a %b %e %T %Z %Y"
%d - day number with leading 0s
%D - same as "%m/%d/%y"
%e - day number with leading spaces
%h - abbreviated month name
%H - hour using 24-hour style with leading 0s
%I - hour using 12-hour style with leading 0s
%j - julian date
%m - month number with leading 0s
%M - the number of minutes with leading 0s
%n - insert a linefeed
%p - AM or PM strings
%q - hour using 24-hour style
%Q - hour using 12-hour style
%r - same as "%I:%M:%S %p"
%R - same as "%H:%M"
%S - number of seconds with leadings 0s
%t - insert a tab character
%T - same as "%H:%M:%S"
%U - week number, taking Sunday as first day of week
%w - weekday number
%W - week number, taking Monday as first day of week
%x - same as "%m/%d/%y"
%X - same as "%H:%M:%S"
%y - year using two digits with leading 0s
%Y - year using four digits with leading 0s
like %d %m %y or %a %d %B %Y %p
</pre>
Shutdown -> right mouse button Scalos, About, Reboot, Shutdown
ToolTypes can be added to the Scalos.info icon like
*SCALOS_PATTERNNO=<number> : background image matching the number
*SCALOS_NOTEXT : The Icon will be drawn without Text.
*SCALOS_NODRAG : The Icon will not be draggable. Its position will be fixed.
*Module iconproperties - Added SCALOS_BROWSERMODE tooltype support
runcommand parameters... in which case:
<pre>
%p = parameters
%w = directory path
%d = device-name
%% = literal percentage token
</pre>
With the help of the wbrexx.plugin Scalos gains support for more of the compatible arexx API
If an arexx command produces an error you will find the error code placed in the WORKBENCH.LASTERROR variable.
ACTIVATEWINDOW
<pre>
/* Activate the root window */
ADDRESS workbench
ACTIVATEWINDOW root
/* Activate the "Work:" partition's window if already open*/
ACTIVATEWINDOW "Work:"
</pre>
CHANGEWINDOW
<pre>
/* Change the root window; move it to position 10,30. * and change its size to 200100 pixels */
ADDRESS workbench
CHANGEWINDOW root LEFTEDGE 10 TOPEDGE 30 WIDTH 200 HEIGHT 100
/* Change the currently active window */
CHANGEWINDOW active 20 40 200 100
</pre>
Most of Scalos' issue are due to the flexibility of its' user configuring nature but if
The sort menu plugin needs to be ported from ASM to C.
IIRC Scalos has a command line option to fully replace Workbench/Wanderer.
The Theme: assign is used by both Wanderer and Scalos but I didn't have any problems using both at the same time.
The Program will be started from the Shell.
If "WB Args" is set, with the Argument "%p" will be replaced by the path of the activated Icons. The Program will started with the specified Stack value.
IconWindow: Scalos opens the window of the specified path.
PlugIn: Starts a Scalos Menu-PlugIn.
If a Menu Item with empty name is specified, Scalos displays a separator line.
It's possible to Drag&Drop an Icon in the Configuration Window. All values will be set accordingly. Entries may be dragged across the list.
Mac-like selection : This function activates a multiselection method used on MacOS or Win95. Don't have to hold down shift to drag them. Clicking on an already activated icon will
not deselect all other icons.
MMB move: The window contents may be moved using the middle mouse button.
WindowPopup title only: PopupMenu for windows can be opened only on window's title bars.
FullBench: Screen-Titles removed and Main Window set Full Size.
Scalos Prefs. Go to Settings->Scalos->Prefs and then the Misc section. Remove the tick against Full Bench. If you've enabled it, the titlebar will disappear when you select backdrop.
Default Icons saveable : The icons which Scalos generates if "show all files" is enabled, can now be saved
using "snapshot" menu option. load DefDisk first : Try to read the icons first from the DefIcons Path before using disk info.
Hide hidden files : If this function is activated all files or directories where the "hide" flag is set will not be shown.
Many of my Icons display more than once on the screen, while on the workbench all seems ok.
The Workbench filters double displayed icons, Scalos does not. Solution: please edit the ".backdrop" file and clear double lines.
Background images not scaled. GUIGfx option not set or guigfx.library and/or render.library not installed.
If working with CD's causes crashs or Scalos doesn't work correctly.
Most Filesystems doesn't support the ExAll function correctly. Disable "Use ExAll" in Scalos prefs.
Scalos doesn't start any program in the WBStartup. WBStartup Path may be set wrongly or Scalos was not started in Emulation Mode (LoadWB etc)
Some programs will not startup with error message "has not returned, wait some more"? and "unable to open your tool"
need a def_icon with the same name predefined, then create an appropriate entry in the list and rename it, if def icon exists it is shown. Below this can define how files are identified.
* either "pattern", similar to magellan to identify file by ending
* or
Then click on the shown icon and define in it what program is used when you double-click on it and save it. On the tab action you can define popup menu for it. All in all handling is of course different to magellan but can do similar
For the RAM Icon, to obtain this you have only to copy the icon in the Icon Path as "RAM.info" or "Ram Disk.info". All functions will automatically be performed
sometimes cut into half or quarters when scrolled off screen or drawers moved - settings issue probably
Sometimes leaves initial drawer window imprint on desktop when moved - settings issue
Scalos AROS released a [https://github.com/deadwood2/contrib/tree/master/scalos new build V2022-07-21] with the following changes noted:
<pre>
Fixed:
Numerous crashes when working on 64-bit with 64-bit heap
Wrong background color of Scalos logo on Scalos splash window
Backgroung image of Scalos splash window and Scalos About window is not visible
Icon labels on desktop and in drawer windows are displayed using Topaz instead of Arial font
Font.prefs are not being loaded on 64-bit
Font.prefs are being wrongly saved on 64-bit
scalos.prefs are not being loaded on x86 and x86_64, scalos is using always default preference
scalos.prefs are being saved on x86 and x86_64 in format not compatible with m68k
NewPopupmenu.prefs is wrongly written
Plugins are not loading at Scalos startup
wbrexx.plugin is crashing at startup on 64-bit
Multiple controls missing on Scalos Prefs/Icons page
System crash when clicking on def icon image on FileTypes Prefs/Recognition page
Status bar, control bar, buttons sometimes don't have images displayed
Buttons in Scalos About window have white corners rendered where they should be transparent
Crash when leaving out an icon
Crash when adding a User-defined Button to Control bar without setting it's properties in Scalos Prefs
Crash when removing any button from Control bar in Scalos Prefs
Scalos Prefs allows editing TTEngine font properties when TTEngine is not present causing crash in Icons/Labels and Text Windows/Fonts pages
deficons.prefs are not being loaded on x86 and x86_64
Reset to default in FileType Prefs and Save does not save preferences
Won't fix:
Scrollbars visible on titles of TrueType Fonts, PopupMenu, Menu, FileTypes, Pallette and Pattern pages of Scalos Preferences
Not fixed:
Wrong rendering on DualPNG icons
Refreshing drawer windows is slow
Starting Prefs/Locale or Prefs/Input from Scalos causes other preferences to fail
Desktop wallpaper is damaged where Splay window was displayed
When started from Wanderer, after saving Scalos Prefs, reload does not re-open main Scalos window
Difference in behavior between Cleanup from popup menu and Cleanup from top menu - possibly due to missing plugin, check Cleanup association in Menu Prefs
</pre>
===DOpus 4 Directory Opus===
Copy DOpus4 app to WBStartup directory folder so it starts on boot up each time
Another method is add the below to the bottom of the user-startup script in S: drawer/directory
<pre>
run DOPUS:DirectoryOpus -i >NIL
</pre>
makes DOpus starts up in Iconified state at the top of Wanderer's screen. Left click on this to highlight and right mouse click to open.
Just click on the sides of either outer edges of DOpus windows and it will display the parent device/volume list.
DOpus saves it features in a CFG file which can be edited to suit anyones' needs by reading the [http://archives.aros-exec.org/index.php?function=browse&cat=utility/filetool Dopus Manual] which is in Guide format.
===BoingIconBar===
User chooses the apps to add to the dock at the centre bottom of the screen but has to be done manually, please use Save afterwards
Or easier edit the text file of SYS:Prefs/Env-Archive/iconbar.prefs and save
<pre>
SYS:System/Shell
SYS:Tools/DOpus4/DOpus4
SYS:Utilities/Editor
SYS:System/SysMon
SYS:System/Scout
Work:Extras/Internet/OWB/OWB
Work:Extras/Graphics/Lunapaint
Work:Extras/Graphics/ZunePaint
AROS:Tools/MPlayer/MPlayer
Extras:Internet/AmiFox/AmiFox
</pre>
right mouse click on bottom edge of screen where boingiconbar shows - select settings which opens BoingIconBar Preferences to add apps
If no dock showing Add, to add apps click Add Program and search for the executable
another method is to drag icons to ends of the bar and move them on the Bar using the Prefs/BoingIconBar
===AmiStart===
On 32bit PCs only - auto generates the apps menu but scans the drive each time - AmiStart can choose apps you are not interested
* how to disable annoying zune/mui 'bubbles'?
try a right-click on AmiStart and release on Global settings. Then click on the bubbles gadget. Move the Show Bubbles slider all the way to the left.
===Fonts===
Install the #?.ttf files to SYS:Fonts/TrueType. Use SYS:System/FTManager to "Install Font" each #?.ttf file which will generate associated #?.otag and #?.font in SYS:Fonts. Use SYS:Prefs/Fonts to change system fonts and SYS:Prefs/Zune to change others.
To achieve our goal we will use the Setup Locale, Input, Zune and Fonts, as well as The FTManager.
Begin
The first step you should do is to get the system to know that we speak and write in another language. What you need to do is to open the setup program and choose Locale country, and list "preferred languages" to put it first and then English. If you want the tab "Time Zone" and select city of residence to set the clock correctly. Of course we save our changes and continue opening the setup program Input. This sets the keyboard language as our beginning. When the language layout was created there was no option to switch to Aros keyboard (layout switching), so to write in the language you had to hold down Alt, something you encounter in other functions. This time working with the team of Aros to create a new keyboard layout to replace the old so we can get rid of the button Alt. For now though let only selected this layout and do not turn the switch on the keyboard.
Custom Keyboard Layout
[http://repo.or.cz/w/AROS.git/tree/HEAD:/workbench/devs/keymaps keymaps are in place but unfortunately when they are not, then indeed things become a bit 'low-level' as it involves redefining some tables with values that match your keyboards]
only need to add your compiled table as new keymap.
So taking a little peek here shows that it should be possible to compile using
gcc -opc105_tr pc_105.c -nostdlib
where the pc105_gr/pc_105.c needs to be replaced with your own adjusted keymapname/c-file
[https://en.wikiversity.org/wiki/Enabling_Greek_Characters_on_Your_Keyboard General overview of Greek letters on keyboards]
Installing fonts
*[http://aminet.net/package/util/wb/EPAGrWb System jaggy]
*Outline resizable .font .otag
In this step you need to download some fonts that can support the encoding in our system. The easiest way is to run the script "Download Fonts" you'll find in the folder OWB. This script downloads from the Internet, and unpacks some fonts for OWB web browser, which is placed under the folder Fonts:TrueType. But as these can only be used by OWB and not the system, which unfortunately does not see. To make them available to the rest of the system, open the program FTManager, you will find the folder AROS: System /. From there select the field "Codepage" option "ISO-8859-7" and list the font "Arial" and "Regular" form in which you must double-click with the mouse. In the window that appears, select the bottom right the checkbox "Anti-aliasing" button and then "Install". Immediately folder Fonts: created files "arialregular.font" and "arialregular.otag", which are necessary in order to see the system font. Do the same steps if you wish for other fonts.
Final stages
After completing the above, open the folder AROS: Prefs / and run the program settings Fonts. In the new window, select the fields "Icons" and "Screen" as the font "ArialRegular" to the size you want. In the field "System" to give "s_courier", which, however, because it is not True Type Font support Antialising, and may seem a little broken. You can also use the CourierNew, if you have installed the above procedure. After you save the changes and open the Zune program settings. In this set the "ArialRegular" font fields in tabs "Windows" and "Groups", and save the changes. Reboot the system. To make sure that the above worked properly run NoWinED, which you will find under the folder AROS: Tools /. If that everything is working correctly you will see the menu and the settings window with Greek letters. You can also write in the language using the button Alt. Second program that you can try, which is fully localized, is WookieChat, which you will find in the folder AROS: Extras / Networking. And in this place all the menu and settings window works.
===Windows===
*Intuition
The window you position and resize, you right click on that windows title bar and in the dropdown menu you snapshot from there. Right click to show menu -> Window -> Snapshot Windows or All but it will NOT work if that folder has no icon (e.g. Disk.nfo) attached to it. You need a folder icon. The window information gets saved in it.
As for maximising the window using a shortcut key - Alt and up arrow key
The AROS-Shell windows can be moved, resized by editing sys:s/icaros-sequence
<pre>
; run shell
if ${Icaros/autoshell} EQ true
run QUIET c:newshell >NIL:
EndIF
</pre>
; slimmer right aros the screen
run QUIET c:newshell con:0/150//300/ >NIL:
; top right corner scr-x scr-y win-x win-y
run QUIET c:newshell con:600/150//300/ >NIL:
*Zune - AROS version of MUI
Magic Menu type functionality is implemented in IControl preferences editor: in the frame called Menus, switch type from Pull-Down to Pop-Up and/or iControl just tick the sticky menu option.
Windows outside screens causing a problem either uncheck "Offscreen move" for windows in IControl prefs editor. Or use FKey commodity and define two key shortcuts:
* the first using the command "cycle windows" (for example ALT TAB);
* the second using the command "rescue window" (for example ALT F5).
Now you can cycle windows until the one you want to rescue, and then "rescue" it: it will move back inside your screen.
How to save the window size on wanderer (snapshot all, snapshot windows)
Same for icon position on wanderer, can't save the position. Icon position cannot be saved yet, but you should be able to save the window position and size. sys:prefs - wanderer icon has option to save window size on exit but just for dh0. To get saving working on (DH1: Extras:) partitions try deleting the dh1 disk.info file, then reboot. The system should create a new dh1 icon.
* how to set up permanently 'view all files'?
As for viewing all files, removing disk.info for that disk did the job
* how to list and kill processes (xkill would be useful) ?
sys:Extras/System/Scout can kill apps
sys:Tools/Commodities/Exchange can remove available commodities
* how to restore 'go up' button in wanderer window? (it doesn't show up anymore).
If you're using Icaros, go to the theme prefs and make sure that decoration is checked. Also, some themes do not use a parent button, so try another theme. You may have to restart Aros before the theme will change.
* Is it really safe to turn off (hardware button) computer at any time (worried about USB hard disk)
yes you can turn off the computer IF none of the drives are in progress (i.e. writing). Best to use Wanderer menu option Quit otherwise
===Say narrator===
SPEAK: is a write-only DOS device for text-to-speech abbreviated as tts.
To check if available, type assign into the shell and at the bottom in the Devices: section should be SPEAK
Examples of use
<pre>
Copy S:Startup-Sequence SPEAK:
Echo "Hello" >SPEAK:M/R/S150/P110
Echo "DH1 EH0 L OW1" >SPEAK:A1
</pre>
Classic options are M/F, R/N, S<rate>, P<pitch>, O0/O1, A0/A1, and D0/D1. O1 recognizes lines beginning with OPT/ as option changes. A1 treats input as narrator phonemes.
Long options select a speech engine:
Echo "Hello" >SPEAK:ENGINE=narrator/VOICE=female/STYLE=natural/LANGUAGE=en-US
Supported selectors are ENGINE=, VOICE=, STYLE=, and LANGUAGE=. Values are case-sensitive backend identifiers. ENGINE=DEFAULT selects the system default. Narrator-compatible selectors continue through the classic translator/narrator pair. Other engines use speech.device. Direct phonemes require a narrator-compatible selection.
===Printing===
This needs further drivers written, we have postscript and write to file support only
*Postscript
Best to set Printer Prefs in the Prefs drawer to print-to-file or parallel/USB port
Save document in postscript or convert picture/text to postscript
Print using compatible [http://en.wikibooks.org/wiki/Aros/Platforms/AROS_USB_support#printer.class_-_PostScript_3_and_internal_ghostscript_drivers Ghostscript printer] or Postscript printer
*GutenPrint
Some work has been done
;There are no individual drivers yet for HP's Photosmart, EPSON's EPL, CANON's, Lexmark, CUPS PPD, etc.
*printer is simply not accepting IPP connections at the moment.
Please try the following steps:
Open the printer web interface in a browser:
http://192.168.1.x/
Look for the network or protocol settings.
Enable IPP / Internet Printing Protocol.
Make sure TCP port 631 is open/enabled.
Save the settings and reboot the printer if the web interface asks for it.
ipp://192.168.1.xx:631/ipp/print
ipp://192.168.1.xxx:631/ipp/
===Files===
====File endings and datatypes====
* Check if the file has his own .info icon file with a tool set to open it. IIRC this has higher priority over the def_XYZ.info file association.
* In ENVARC:SYS/def_Text.info or whatever def_ file needs changing, use Wanderer's menu Icon -> Information and change the def_XYZ.info there. If you're on ABIv0 and want it to be applied immediately, you might have to copy it to ENV:SYS/ (or to reboot).
* Identifying file types by file ending is only a fallback. Far better it is to search for magic words, for flac files this would be "flaC" according to this [http://flac.sourceforge.net/documentation_format_overview.html documentation].
For instance, to open PDFs with arospdf not localised in the default drawer of Icaros (Work:Extras/Applications/arospdf) but localised in a custom drawer in AROS. The default tools are defined in the icons in sys:prefs/env-archive/sys e.g. def_PDF.
File type identification is done by datatype descriptors which you can find in Devs/Datatypes. The AROS build system has a tool which creates such datatype descriptors.
'''Changing of default tools of existing icons is easy as shown above. Adding of new file types is not hard, but needs knowledge of the AROS build system.'''
The enduser way would be to download the attached file, which contained two executables:
1) createdtdesc, to make a new datatype description
2) examinedtdesc, to read/show existing datatype descriptions
use 2 to get an idea on how it things are currently done in aros by providing this executable a file from the drawer sys:devs/datatypes/ (alternatively you can find the original .dtd files here).
use 1 to make your new datatype. Use the accompanied FORMAT file (also here) to read how to make your own datatype descriptor. use 2 to get hints from other datatype descriptors.
Note:
When creating a new descriptor would advise against using the pattern property, but instead use the default pattern of #? and create a Mask that matches your filetype. This requires some research in order to discover how your filetype can be recognized properly. Of course with making something like a descriptor for an ascii textfile, you would fallback to using the pattern (e.g. #?.text as the filetype cannot be determined easily otherwise).
<pre >
# name - choose wisely and informative. also used for icon's name.
# version - choose as you like as long as it complies with version rules
# basename - the 'root' datatype class. be aware that e.g. it can influence behaviour. for example when choosing binary and using tool multiview in project icon, the file will be viewed as binary file (choosing sound would tell mulitview to view the file as a soundfile). So this can influence the underlying tool being used. Could become messy if users started to modify the tool manually.
# pattern - This is the file pattern match e.g. #?.text
# Mask - A mask to identify the file. Requires knowledge of the actual file structure. For example 'M' 'Z' for an msdos executable.
# GroupdID - not supported (AROS native) files - use syst as that would be the least intrusive in case an AROS tool/program tries to load such datatyped file.
# ID - In your case, the first four characters of the name at subchapter 1 (in lower case) (or less if name is shorter).
# flags - How the mask needs to be interpreted. In your case would be mostly DTF_BINARY in combination with (wanted or not) DTF_CASE (to tell if mask used letters are case sensitive or not)
# priority - the priority of how the type is handled so that on datatype could have precedence over another? In any case, document tells it to be mostly 0.
</pre >
Now that you know each field and what it does (more or less), you write this fields in a text file for your own invented datatype, save it and create the actual dt with the tool in 1. in the end the created dt must reside in sys:devs/datatypes/ drawer.
Then you would create a default icon in sys:prefs/Env-archive/SYS drawer. Don't forget to reboot or copy .info file to ram:env/sys in order to test. also don't forget to set which tool to start f.e. c:lx or dh4:emulators/mycoolemulator
To test, open Wanderer then show all files and doubleclick on a file of type you just created. Alternatively you could use the 'open' command from shell (with file of datatype you just created as parameter).
And as a last note. it would perhaps be welcome to have a program like xicon and/or runprglist for AROS (unfortunately both without source, but something similar could be created for AROS).
Sounds complicated ?
Perhaps... but OS like windows needs a complete registry to be able to do things like this. And yes, i am aware windows has gui tools that does it (more or less) for you (by manipulating the registry). Same could be done for AROS (without integrating a registry in AROS that is ).
Would that suffice ?
red1+2: typos, reformatting.
disclaimer: please note that using these tools can screw up your currently installed support for datatypes when used incorrectly. Do not use if you do not understand what you are doing. Use at own risk.
==Network Connection==
AROS currently only has one real choice for TCP/IP networking - AROSTCP. This is a port of the AmiTCP package from AmigaOS (TM), with a number of enhancements/fixes from AROS developers.
Please use Prefs/Network to set up wired, wireless or USB networking
Non USB wifi is easier, USB wifi can be an annoyance - remember to save whilst in prefs
===Wired===
=====IPv6=====
Some support
128bit IPv6 address packet
<pre>
Local FD::/8
Global 2000::/3
64:ff9b::/96
</pre>
NAT64 translates IPv6 to IPv4
DNS64
OS routing works with
<pre>
MacOS Ventura
Windows 11 with cloud account
Ubuntu Jammy Jellyfish
Android 10 (block google dns)
</pre>
====IPv4====
The top half of the IPv4 Configuration tab on the Network Prefs deals with the network card/USB and the lower half the router part.
[[File:AROS Wanderer Network Prefs DHCP.png|thumb|DHCP Settings]]
'''Upper part of IPv4 tab'''
* Click Add on the top right of the Prefs which opens a window called '''Interface'''
* Enter Name as net0 (but can be anything as long as it is consistently used in other sections)
* check mark on Active
* select device to be used using the '''right hand-side gadget''' of the box where the device name will go
* set Unit to 0
* IP Mode is default set to '''Get address from DHCP'''
* IP Mode set to Manual if DHCP does not work automatically
From the shell CLI, ifconfig -a
Under net0: section, inet starting 192.168.x.xxx
* inet or '''Address''' of network card
* netmask convert to decimal so 0x'''ffffff7f''' becomes 255.255.255.247 which is used to adjust the above '''Address''' into
* broadcast 192.168.xxx.xxx
click OK
[[File:AROS Wanderer Network Prefs Manual.png|thumb|Manual Settings]]
'''Lower part of IPv4 tab'''
* IP Mode Get address from DHCP (default)
* or changing to Manual if automatic DHCP set up does not work
* '''Gateway''' (Router Internal LAN-IP) (Default Route) = 192.168.0.1 (D-Link Netgear), 192.168.1.1 (Linksys 3com), 192.168.2.1 (SMC Microsoft), 192.168.1.254 (Belkin), 192.168.123.254 (USRobotics) else check with your router manual
* first DNS = use 208.67.222.222 (opendns) or Gateway number above (to test web browser access to router) or 212.50.160.100 (google) i.e. or whatever your ISP needs you to set
* second DNS = use 208.67.220.220 (opendns) or Gateway number above (to test web browser access to router) or 213.249.130.100 (google) i.e. or whatever your ISP needs you to set
* At the bottom of IPv4 tab, check mark the '''Start networking during system boot''' option
* Save and reboot (sometimes Network restart fails, so reboot every time to be sure)
'''an alternative way''' to AROS ifconfig -a, other OSs have similar for the same internet connection. Another connection will have different settings.
e.g. From [http://www.ncsu.edu/resnet/windows/ipconfig/ Windows], '''ipconfig /all'''
and note down the IP, subnet mask, default gateway, and DNS servers values and put these values in "manually" into AROS Network prefs.
e.g. From Linux via dhcp router have a look at etc./dhcpc/dhcpcd-eth0.info
* for manual input look at /etc/networks (IP or Gateway) and /etc/resolv.conf (DNS)
Please note that all in one routers (wired+wireless) or separate routers may need different settings
IPv4 involves routing (192,168.x.x), firewall, NAT
===Wireless===
[[File:MyArosWirelessSetup.png|thumb|Setting up]]
[[File:MyArosWirelessTCP.png|thumb|Shell commands to work out what is happening]]
We must first make certain you have a Atheros 5k chip inside acting as the wireless wifi option. Open PCITool in Tools directory. Down left hand side are a series of numbers 0.00.0 etc. Click on some at the bottom and hopefully one of them will say Atheros AR5??? or AR242?.
or a Realtek RTL8187B, we can check using Prefs/Trident as this one is USB based
There are many similarities with the above Wired set up so please read the above section as well
* open Network/Prefs
* In '''IPv4 Configuration''' tab - click Add - enter net0 / active tick / #?.device / Unit 0 / IP Mode = manual (important if default DHCP does not work automatically)
Make sure that any extra network names (e.g. eth1 or net1) should be deleted. If net0 already st previously, change net0 so that it shows associated with the appropriate device name like atheros5000.device or realtek8180.device. Having two entries here will cause sub-net problems.
* Go to '''Wireless''' tab and click on "Add" button.
* Insert network name (SSID your wireless network name use wirelessmanager to get it), select right "encyption" that is most likely "WPA".
* Key Type set as "Passphrase". i.e. type in your password for your router (aka access key).
* Unselect (no tick) "hidden" if it is selected, then apply. You may have to tick it if wireless does not work.
* Finally, Save and '''reboot'''.
For the best chance of success, set networking to start at boot, and then reboot with the USB adapter plugged in.
===USB Ethernet===
Open SYS:Prefs/Network and in the IPv4 Configuration tag (top table covers your usb stick)
* click Add button
* set Name as net0
* Tick Active box
* enter the usb-ethernet.device e.g. dm9601eth.device, usbpegasus.device or usbasixeth.device use SYS:c/devlist, '''Scout''' or trident prefs to get the correct spelling
* set Unit to 0 (which is usual but check the messages from the bottom of the Trident prefs whilst plugging the device in to determine the unit number otherwise)
* IP Mode is set to Get address from DHCP (make sure your router is set right for that)
'''or manual'''
* IP Address of network card, i.e. 192.168.0.xx or 192.168.1.xx (xx being greater than 1)
* Subnet netmask = 255.255.255.0
* click OK
There can be sometimes be boot failures when using USB ethernet - plug the USB device in after boot and save the network prefs to make it work again.
Lower part of IPv4 tab covers the router information
* IP Mode Get address from DHCP
'''or if manual settings'''
* Gateway (IP Address of router) = usually 192.168.0.1 or 192.168.1.1 but see router manual to make sure.
* first DNS = use 8.8.8.8, 208.67.222.222 (opendns) or 212.50.160.100
* second DNS = use 8.8.4.4, 208.67.220.220 (opendns) or 213.249.130.100
===USB Tethering via Android smartphone===
Go to AROS Network Prefs (IPv4 configuration tab) and write type in "usbrndis.device" in the "device" textfield of "Interface" sub-window, which appears when you add a new device (or modify an existing one). Select "Start Network during system boot" and saved the configuration, the Connection is immediate no reboot is needed.<br>
usbrndis.device is a resident device (virtually always there) in fact, a driver is not present in DEVS:Networks <br><br>
Plug in USB cable, go to Android settings and enable "USB Tethering" <br>
A reboot should not be necessary.
When restarting AROS, the Smartphone deactivates the connection and to access the network again have to reactivate it before starting the browser.
===Solving Issues===
[[File:MyArosTCP.png|thumb|Aros network setup diagnostics - why does it not work?]]
* In Network Preferences, have '''only one''' item in the IPv4 Configuration tab
* If using manual settings, make sure all numbers are correct, especially for IP address of the card/usb (changing the last number in chain of four)
* For any USB based networking, it is often necessary to save in Prefs/Network, reboot AROS and network support can begin
* For wired, make sure that the LAN-cable is plugged in before starting the computer
* If wireless, try getting closer to the router.
* Switch off the encryption option from your router then try wifi, if successful then your ip/dns is ok. If not then your ip/dns settings are most probably wrong or need to use one or more opendns numbers
* Replace detachable wireless antenna (best wireless option to buy if you can) with a stronger antenna ie. 5 dBi or 7 dBi
* Try with another computer/laptop/machine
Program Error C:WirelessManager
* Test with another OS
* Check that Wifi works before changeover (if possible)
* Check that socket and card are working
* Check if card is too new for laptop (date code on card MMYY blue askey date 2005-2007 etc)
Are you connecting with the Router ?
Check with protection off e.g. wps and wep to see if it makes a difference.
For USB wireless - stopping and starting may be needed...
<pre>
; $VER: AROSTCP-startnet 1.0 (01/08/06)
; AROSTCP-startnet (c) The AROS Dev Team.
;
Run <NIL: >NIL: AROSTCP
WaitForPort AROSTCP
If NOT Warn
; echo "Stack online"
Else
echo "Wait for Stack Failed"
EndIf
; stop and restart
execute "sys:system/network/AROSTCP/s/stopnet"
Run <NIL: >NIL: AROSTCP
WaitForPort AROSTCP
If NOT Warn
; echo "Stack online"
Else
echo "Wait for Stack Failed"
EndIf
run <NIL: >NIL: wirelessmanager realtek8180.device
</pre>
What IRQ number is assigned to the device? You can check with Tools/PCITool?
It's possible the BIOS hasn't set the right IRQ number. If you have a Linux CD/DVD handy, could you check if it boots with the options "acpi=off noapic nolapic"?
If the following does nothing, this will help us figure out why networking doesn't start automatically at boot
open a shell and run the following commands:
<pre>
echo ${AROSTCP/AutoRun}
echo ${AROSTCP/WirelessAutoRun}
echo ${AROSTCP/WirelessDevice}
</pre>
Please report the output, typically it will look like this
# True (explanation this variable is related to the "Start networking during system boot" checkbox in network prefs)
# True ()
# Devs:networks/atheros5000.device unit 0
If there's a problem with the AROSTCP package. What's the output of this?
ENV:sys/packages/AROSTCP
should return a string = Sys:System/Network/AROSTCP
By the way, a quicker way to check networking is working would be to run some shell commands such as:
<pre>
ping www.google.com
ifconfig net0
</pre>
The best way to list the available networks and diagnose / troubleshoot problems with connecting to a wireless network is to run WirelessManager manually. First uncheck the "Start networking during system boot" box in the Network prefs app, then save and reboot. Then run this in a shell:
C:wirelessmanager atheros5000.device verbose
or
C:wirelessmanager realtek8180.device verbose
and capture the output
If the above does not help, could you edit the file SYS:System/Network/AROSTCP/S/Package-Startup, and change ">NIL:" to ">T:wifi.log" on the WirelessManager line and add this as well Wait 5?
<pre>
if ${AROSTCP/WirelessAutoRun} eq "True"
Run QUIET "C:WirelessManager ${AROSTCP/WirelessDevice} >T:wifi.log"
wait 5
EndIf
</pre>
Then save, reboot and post the log file (T:wifi.log) here.
<pre>
c:wirelessmanager atheros5000.device verbose
Initializing interface 'atheros5000.device:0' conf 'ENV:Wireless.prefs' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file 'ENV:Wireless.prefs' -> 'ENV:Wireless.prefs'
Reading configuration file 'ENV:Wireless.prefs'
Line: 1 - start of a new network block
ssid - hexdump_ascii(len=7)
65 63 68 65 6c 6f 6e echelon
PSK (ASCII passphrase) - hexdump_ascii(len=14): [REMOVED]
key_mgmt: 0x2
PSK (from passphrase) - hexdump(len=32): [REMOVED]
Priority group 0
id=0 ssid='echelon'
Then it just sits there. Not sure what a normal dump looks like, I don't see anything that looks wrong in the configuration.
</pre>
looks like the driver isn't working with that card. Has anyone else successfully used that exact model number (AR2413)?
<pre>
Initializing interface 'atheros5000.device:0' conf 'ENV:Wireless.prefs' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file 'ENV:Wireless.prefs' -> 'ENV:Wireless.prefs'
Line: 1 - start of a new network block
ssid - hexdump_ascii(len=7):
65 63 68 65 6c 6f 6e echelon
PSK (ASCII passphrase) - hexdump_ascii(len=14): [REMOVED]
key_mgmt: 0x2
PSK (from passphrase) - hexdump(len=32): [REMOVED]
Priority group 0
id=0 ssid='echelon'
*** [wpa_sm_init] sm->pmksa=02c66fd4 ***
Own MAC address: 00:01:36:15:ae:0c
RSN: flushing PMKID list in the driver
Setting scan request: 0 sec 100000 usec
EAPOL: SUPP_PAE entering state DISCONNECTED
EAPOL: Supplicant port status: Unauthorized
EAPOL: KEY_RX entering state NO_KEY_RECEIVE
EAPOL: SUPP_BE entering state INITIALIZE
EAP: EAP entering state DISABLED
EAPOL: Supplicant port status: Unauthorized
EAPOL: Supplicant port status: Unauthorized
Added interface atheros5000.device:0
State: DISCONNECTED -> SCANNING
Started AP scan for wildcard SSID
MLME: starting scan
MLME: scan channel 1 (2412 MHz)
sana2: sending MLME frame
Then it stops. Does this mean the router is not authorizing this NIC?
IRQ 4 (A)
</pre>
apparently locking up when the first frame is sent (a scan request).
<pre>
Devs/Networks/atheros5000.device:0
Initializing interface 'Devs/Networks/atheros5000.device:0' conf 'ENV:Wireless.prefs' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file 'ENV:Wireless.prefs' -> 'ENV:Wireless.prefs'
Reading configuration file 'ENV:Wireless.prefs'
Line: 1 - start of a new network block
ssid - hexdump_ascii(len=12):
41 69 72 4c 69 6e 6b 35 39 33 30 30 AirLink59300
PSK (ASCII passphrase) - hexdump_ascii(len=8): [REMOVED]
key_mgmt: 0x2
PSK (from passphrase) - hexdump(len=32): [REMOVED]
Priority group 0
id=0 ssid='AirLink59300'
*** [wpa_sm_init] sm->pmksa=0224e444 ***
Own MAC address: 00:1f:e1:42:e3:7a
RSN: flushing PMKID list in the driver
Setting scan request: 0 sec 100000 usec
[eloop_reg_timeout] Timeout is at 1317686594.160000
EAPOL: SUPP_PAE entering state DISCONNECTED
EAPOL: Supplicant port status: Unauthorized
EAPOL: KEY_RX entering state NO_KEY_RECEIVE
EAPOL: SUPP_BE entering state INITIALIZE
EAP: EAP entering state DISABLED
EAPOL: Supplicant port status: Unauthorized
EAPOL: Supplicant port status: Unauthorized
[eloop_reg_timeout] Timeout is at 1317686595.060000
[eloop_reg_timeout] Timeout is at 1317686604.060000
Added interface Devs/Networks/atheros5000.device:0
[eloop_run] Starting
State: DISCONNECTED -> SCANNING
Starting AP scan for wildcard SSID
MLME: starting scan
[eloop_reg_timeout] Timeout is at 1317686594.160001
MLME: scan channel 1 (2412 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.193000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.233000
MLME: scan channel 2 (2417 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.253000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.293000
MLME: scan channel 3 (2422 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.333000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.373000
MLME: scan channel 4 (2427 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.393000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.433000
MLME: scan channel 5 (2432 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.473000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.513000
MLME: scan channel 6 (2437 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.553000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.573000
MLME: scan channel 7 (2442 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.613000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.653000
MLME: scan channel 8 (2447 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.693000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.713000
MLME: scan channel 9 (2452 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.753000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.793000
MLME: scan channel 10 (2457 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.833000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.853000
MLME: scan channel 11 (2462 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.893000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.933000
MLME: scan channel 12 (2467 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.973000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.013000
MLME: scan channel 13 (2472 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.033000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.073000
EAPOL: disable timer tick
EAPOL: Supplicant port status: Unauthorized
MLME: scan channel 14 (2484 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.113000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.153000
MLME: scan channel 1 (2412 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.193000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.213000
MLME: scan channel 2 (2417 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.253000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.293000
MLME: scan channel 3 (2422 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.333000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.353000
MLME: scan channel 4 (2427 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.393000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.433000
MLME: scan channel 5 (2432 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.473000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.493000
MLME: scan channel 6 (2437 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.533000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.573000
MLME: scan channel 7 (2442 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.613000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.653000
MLME: scan channel 8 (2447 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.673000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.713000
MLME: scan channel 9 (2452 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.753000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.793000
MLME: scan channel 10 (2457 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.833000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.853000
MLME: scan channel 11 (2462 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.893000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.933000
MLME: scan channel 12 (2467 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.973000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.993000
MLME: scan channel 13 (2472 MHz)
[eloop_reg_timeout] Timeout is at 1317686596.033000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686596.073000
MLME: scan completed
</pre>
Is your network hidden? If so, did you enable the 'Hidden' checkbox in the network prefs? What distro version are you using?
<pre>
"ENV:sys/wireless.prefs" looks like this:
network={
ssid="testadhoc"
key_mgmt=NONE
wep_key0="12345"
wep_tx_keyidx=0
}
</pre>
If your router doesn't broadcast its SSID (hidden), you need to add this option to the network block of the wpa_supplicant.conf on your aros machine and make changes after # Example blocks:
scan_ssid=1
Here's a full description of all the [http://hostap.epitest.fi/gitweb/gitweb.cgi?p=hostap.git;a=blob_plain;f=wpa_supplicant/wpa_supplicant.conf config file options].
<pre>
ap_scan=1
network={
ssid="YOURESSID"
scan_ssid=1
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
psk=YOURPASSWORD
}
</pre>
<pre>
filter_ssids=1
ap_scan=2
network={
ssid="REMOVED"
scan_ssid=1
bssid=REMOVED
priority=100
mode=0
proto=RSN
key_mgmt=WPA-PSK
auth_alg=OPEN
pairwise=CCMP
group=CCMP
psk=REMOVED
}
</pre>
Error 6: Couldn't resolve host name.
Check Scout -> Devices and look at the device that you are using, in the OCnt column it should state 2 which means AROSTCP and Wirelessmanager are both accessing this driver. If 0 or 1, then uncheck the checkbox in Network prefs for starting networking at boot, save and reboot. Then run this is the shell:
C:WirelessManager realtek8180.device unit 0
some quirks setting up the wireless network as well
1) it's far better setting up either the wired OR the wireless network adapter as net0:, or weird things happen
2) it's better using fixed IP on the local network instead of DHCP
3) network setting must be placed in network setting panel in /prefs, using the wirelessmanager helped me finding available SSIDs, but not actually connecting to them
once done, reboot.
If previous setup is proving problematic
<pre >
SYS:Prefs/Env-Archive/Wireless.prefs
SYS:Prefs/Env-Archive/Zune/OWB.config
SYS:Prefs/Env-Archive/Zune/global.config
SYS:Prefs/Env-Archive/AROSTCP/WirelessDevice
SYS:Prefs/Env-Archive/AROSTCP/db/Interfaces
</pre >
Make a copy of these files and restore in case of problems.
Please try this test to check if you can connect to your router, ie established that the WiFi layer is working
̊̊̊̊Boot with networking disabled, by make sure that "Start networking at boot" in Network Prefs is unchecked (no tick).
̊ Run this in a shell: C:WirelessManager atheros5000.device VERBOSE
̊If the output of that command is too long to summarise here, you can redirect it to a file by adding >RAM:wifi.log to the end, then attach or paste that file here.
try running "status" in the shell and check that AROSTCP is listed/running
If AROStcp is not showing, then AROSTCP is not running. attempted to start it by clicking Use or Save in network prefs, or checking the "start networking at boot" box or typing into a shell.
Execute SYS:System/Network/AROSTCP/s/startnet
(run Status again afterwards).
The "cannot resolve hostname" will appear if you are blocked on the wifi network by the router as well as aros not being able to assign correct network address.
One way of testing this might be to disable the firewall in the router. you might also check the router how it sees the attempts aros do to speak to it. The easiest way to do that would be to manually give aros an IP number in the routers accepted range. and see if it shows up at all within the router.
Tests that can be undertaken to determine correct settings and functions
pciinfo
sanautil -d broadcom4400.device status
<pre >
ping <router-address> e.g. 192.168.0.1 (aka inet) or 80.237.146.33 (www.amiganews.de)
ifconfig net0
ifconfig net0 up
extras:networking/utils/sanautil/sanautil -d atheros5000.device status
WirelessManager atheros5000.device verbose >RAM:wifi.log
;to send the log to RAM disk to be read easier or if detected,
Run WirelessManager atheros5000.device >NIL:
Run WirelessManager atheros5000.device ssid="mynet1" >NIL:
C:WirelessManager realtek8180.device unit 0
</pre >
Please look at the task list in Scout, and check if WirelessManager and AROSTCP are running. Also look at the device list in Scout to check if realtek8180.device is open.
start tools/debug/sashimi, maybe it shows some debug messages when disconnection happens.
Firstly, let's take a look at what your setup most likely looks like, assuming you use a router. See diagram below:
<pre>
Internet <---------> home router <---------> computer
-----------external IP------------------internal IP-------------
</pre>
Okay, so what am I trying to show you with that diagram. A few things. Firstly, the IP address that connects you to the Internet is not the same one that connects you to your router. What happens is that your computer doesn't have a direct connection to the Internet, instead your router connects to the Internet, and your computer connects to the router.
You can see the external and internal IP addresses in these example settings...
* Default Gateway : 76.91.64.1 (external IP for ISP/Internet host)
* IP Address : 76.91.71.184 (external IP for home router)
* IP Address : 192.168.0.1 (internal IP for home router)
* Address = 192.168.0.161 (internal IP for computer)
As you can see, there are two internal IP addresses and two external IP addresses. This is because there is a client/server relationship, effectively one address is for the service (server) and one address is for the device trying to access that service (client).
The server addresses in your case are 76.91.64.1 (your ISP's address, serving the Internet), and 192.168.0.1 (your home router's address, serving your home network). The term gateway applies here, they are your gateway to those services.
Subnet masks are used along with IP addresses to determine which IP addresses are allowed access to a network. I did learn the more in-depth rules about subnet masks once (watched a CCNA vid), but I've forgotten about it. The basic level of understanding you'll need is easy to remember though. A subnet mask value of 255 means that portion of the IP address must stay constant, whereas a subnet value of 0 means any unassigned value up to 255 is allowed in the IP address.
By far the most common subnet value is 255.255.255.0. What this means is that the first three parts of the IP address you use to connect to a service must stay the same as the server/gateway address, and only the last section can change.
So if your router's internal IP address is 192.168.0.1, and the subnet mask is 255.255.255.0, the only addresses that will be allowed to be used on that network are between 192.168.0.2 and 192.168.0.255 (I think 192.168.0.0 is reserved for other uses).
Final point to make is about DHCP (a.k.a. dynamic IP) vs static IP. A server/router using DHCP gives a device that connects to it an address within the acceptable range. It usually starts with the lowest numbered free address, so with your router it'll give the first device that connects to it 192.168.0.2, the next device 192.168.0.3, and so on. Static IP addresses are where you set the IP address you want to connect with in advance.
When using static IP addresses on a router where DHCP is active, it's good to use a high number to avoid conflicts with other devices that are connected to your network, to reduce the risk that both devices will try using the same IP. That's why your current choice of 192.168.0.161 is good, unless you have over 159 devices connected on your current network!
Okay, so what's the next step. Well, if you can use ping, I'd suggest pinging 192.168.0.1. If you get a positive response it means you're connected to your router, if you don't get a response it means the connection between your router and your computer is at fault.
Documentation on configuring the AROSTCP environment further can be found [http://en.wikibooks.org/wiki/Aros/User/Networking here]
===File Sharing===
As AROS knows only a few filesystems (FFS, OFS, SFS, PFS (amiga only), FAT12, 16, 32, Microsoft NTFS (windows), UDF (Blu-ray)).
The others in regular use like MacOSX hfs+, Linux ext2/ext3 and ext4, Haiku BeFS provide a problem in transferring files.
Linux can access SFS partitions but it needs to be compiled. The latest full source are [http://home.elka.pw.edu.pl/~mszyprow/programy/asfs/ here]. It compiled fine with a 2.6.30 kernel in Puppy Linux 4.31.
An alternative, is to use a FAT32 partition to share. Setup a 4G FAT32 partition using HDToolbox for sharing, and the rest of the space as SFS for an Aros install. It works very well.
Files could be transferred via TCP internet network.
====SMB2/3====
With Windows you can share one folder or all folders of the "Public" user.
On Windows what is important is to enable sharing (Network and Sharing Center).
AROS Mountlist should look lke this
<pre>
Handler = L:smb2-handler
StackSize = 65536
Priority = 5
GlobVec = -1
ACTIVATE=1
Startup = "smb://UserAcc:password@PCShare/Sharefolder"
</pre>
which could also be
"smb://UserPC:password@192.168.x.x/Public"
or
"smb://UserPC:password@Name-PC/Public"
so
"smb://UserPC:password@192.168.1.158/Folder"
or
"smb://UserPC:password@Name-PC/Folder"
After you have configured a share generates a DOSDrivers it is named "SMB0" which includes the setting, and at each reboot it is Mounted. You can still delete the DOSDriver by hand, is located in Storage/DOSDrivers, the file "ServerAutoMounts", in ENV:AROSTCP which indicates the DOSDriver to be mounted, should also be deleted.
The per-mount files are written to ENV:SMB or SYS:Storage/DOSDrivers. There is also additional file ENV:AROSTCP/ServerAutoMounts which states what will be presented to the end user.
====Old SMBFS====
e.g. to connect to a NAS share such as \\NASBOX\Shared use -:
SMBFS WORKGROUP=<YOUR WORKGROUP NAME> VOLUME=<AROS volume name to use>: SERVICE=<UNC Path to connect to>
SMBFS WORKGROUP=MYNET VOLUME=Shared: SERVICE=//NASBOX/Shared
And you will then have an icon appear on your desktop for the volume name you have chosen.
You can put the above script into wbstartup or
give it an icon, change it to a 'project' and give it the default tool c:iconx
Open a shell and type copy sys:script.info "sys:wbstartup/YOURSCRIPTNAME.info"
This should create an icon for your script file.
Now right-click on your script and select 'information'.
Change 'tool' to 'project', put 'c:iconx' into the 'default tool' box, click save
The reason being that scripts need to be opened with 'execute SCRIPTNAME' (or 'iconx') whereas the programs started from wbstartup are opened using 'run PROGRAMNAME'. It's the same as trying to start a command-line tool from the workbench by double-clicking it.
====Setup ISO images within AROS====
Use [http://archives.aros-exec.org/index.php?function=browse&cat=driver/storage DiskImage] which supports many cd image formats ISO, CCD, MDF/MDS, CUE/BIN, NRG and UIF. To mount CD or DVD images use below....
<pre >
# Rename your iso 'Unit0' (note no extension).
# Do 'View/All files' on you Aros partition. You should now see a folder called 'Diskimages'. Copy your renamed iso to there.
(Alternatively, you could type at the shell 'assign FDSK: xxx', where xxx is the location of your iso.)
# From the shell, type 'mount CD0:' and the iso should appear on the Wanderer desktop. You can now access it like a real disk.
</pre >
assign devname: dismount
Assign DOSVOLUME: remove
[http://aminet.net/package/disk/misc/unmount-0.1 unmount] most filesystems work but SFS lacks support for ACTION_DIE packet
If you are using an IcAros install, the startup scripts are set up to wipe the Diskimages directory on boot, so its worth keeping a second copy of the iso somewhere else. Alternatively, you could set up extra mountlists for additional iso images. I've made a file called iso1 in the Aros:devs directory that contains the following text:
<pre>
/* Entry for ISO image */
ISO1:
FileSystem = cdrom.handler
Device = fdsk.device
Unit = 1
LowCyl = 0
HighCyl = 0
Surfaces = 1
BlocksPerTrack = 1
DOSType = 0x41434400
Activate = 1
#
</pre>
Then I just need an iso called 'Unit1' (corresponding to the 'Unit = 1' entry in the mountlist) in Diskimages (or wherever I assign FDSK: to) and to mount I type in at the shell:
Mount iso1: from devs:iso1
Of course, if you create mountlists for ISO2, ISO3:, etc. (with the corresponding change to the 'Unit = ' line) you can have as many isos mounted as you wish. I just call mine ISO1: etc. to distinguish them from the real CD drives
==Video Guides==
Video demonstrations and tutorials covering:
:00. '''Introduction'''
::[https://www.youtube.com/@jamesmattson6813/videos Various Aros Installs],
::[https://www.youtube.com/embed/j8EmSEby0Rg AROS repo in gource, view of AROS dev commits from 1997 to 2025], [http://www.youtube.com/watch?v=Vx_zqlBow40&feature=related Gource view of AROS 1997 up to 2009],
::[http://www.youtube.com/watch?v=s1RsvEm7UrU Why an Amiga OS in 2011],
::[https://www.youtube.com/watch?v=1W886mheV74&pp=ygUPYW1pZ2EgYXJvcyAyMDI2 Johan Grip on early days of AROS x86], [https://www.youtube.com/watch?v=mXaKDhtTTqQ&t=14s&pp=ygUPYW1pZ2EgYXJvcyAyMDI2 Michel Schulz on Aros and PiStorm],
:01. '''Installation'''
::[https://www.youtube.com/watch?v=M7YjufrJqDs Aros One install], [https://www.youtube.com/watch?v=iIMguHTdC5E Aros One USB install], [https://www.youtube.com/watch?v=ZNXauy5m5Wc Aros One install], [http://vimeo.com/11013489 Modify Grub boot],
::[http://www.youtube.com/watch?v=wyQVeyXIywc&feature=channel iMica Silent Pt3], [http://www.youtube.com/watch?v=o2AnkoflY14 Wipe whole drive and Install - warning loss of data on drive],
::[http://www.youtube.com/watch?v=OVXm6_-witQ VirtualBox install], [ VMware install],
::[http://www.youtube.com/watch?v=0k2PEmT8I14 Broadway AROS Install],
::[https://www.youtube.com/watch?v=PtDiXhjSIfs Is Aros Icaros a choice?],
::[ driver install],
::[http://www.vimeo.com/10491104 HDAudio install but needs account], [],
:02. '''Amiga Basics'''
::[http://www.youtube.com/watch?v=TY8mWxwzH5o Screens tutorial],
::[https://m.youtube.com/user/AMIGASYSTEM/videos General], [ Dos Scripts tutorial], [http://www.youtube.com/watch?v=hPT7SmVEpjc OS 1.2], [http://www.youtube.com/watch?v=n6kX3FqH8Ww&feature=related OS 1.3],
:03. '''Customisation demos'''
::[https://www.youtube.com/@AMIGASYSTEM/videos Prefs tutorial], [ Decoration tutorial], [http://www.youtube.com/watch?v=Dn5C8G3aDXU Scalos],
:04. '''Setting up''' internet access and surfing the web, FTP, IRC and Mail apps
::[ Network Prefs], [ AirCOS tutorial], [ jabberwocky tutorial],
:05. '''Native bundled Games and Applications'''
::[http://www.youtube.com/watch?v=aYlFv2B-VXc 3D Games], [http://www.youtube.com/watch?v=MXK7wwhd-R0 Latest Games], [http://www.youtube.com/watch?v=RUgiVThv23Q&feature=mfu_in_order&list=UL PrBoom GL], [http://www.youtube.com/watch?v=0s7u8TPy7V4 Assault Cubes], [http://www.youtube.com/watch?v=fih6aCXKeqs Cube 2], [http://www.youtube.com/watch?v=-X0ay0MGOms DosBox on Aros], [http://www.youtube.com/watch?v=7nKduDjf14k Oct 2010],
::[http://www.youtube.com/watch?v=FziV2z_uxnQ Apps Pt 1], [http://www.youtube.com/watch?v=xs37_nfa5CI Apps Pt 2], [http://www.youtube.com/watch?v=Bn59_VvbQR0&feature=related Apps Pt 3],
::DOpus4 [http://www.youtube.com/watch?v=aSRybWjrrME DOpus 4],
::Milkytracker [http://www.youtube.com/watch?v=VxBOEPzpdKg&feature=related Laying Down Base Tracks],
::[http://www.youtube.com/watch?v=k2uKQ0-ieOE Audio Evolution 4 in action], [http://www.youtube.com/watch?v=Zq4r9k0_jZI Quick Videos],
::[http://www.youtube.com/watch?v=gGKCFZcIc0I&feature=related ScreenRecorder], [http://www.youtube.com/watch?v=974c2e-Fqak&feature=related TV out Tests],
::[http://www.youtube.com/watch?v=fjq8ct5d5IY AmiFIG], [http://www.youtube.com/watch?v=h0rHvPhYJo4&feature=youtu.be ZuneFIG],
::[http://wiki.povray.org/content/Documentation:Tutorial_Section_1 POVray Tutorial 1],
::[http://www.youtube.com/watch?v=Jk-ZNLfJsvQ pt 1, jan. 2008], [http://www.youtube.com/watch?v=nWRy33g1R7Y pt 2, feb. 2009], [http://www.youtube.com/watch?v=r5PbhCtm4vE pt 3, feb. 2010],
::[https://www.youtube.com/watch?v=G7_FJUoQ89o Hollywood programming], [], [], [],
::[], [], [],
::[], [], [],
::[], [], [],
:06. '''Commercial software available'''
::[http://www.youtube.com/watch?v=fKXY9B4R43s AntiryadGX 3D Game Editor],
::[http://www.youtube.com/watch?v=TMS9NDzwm5U BOH indie Game],
:07. '''Running classic amiga apps and games'''
:: Amiberry [], [],
::[http://vmwaros.blogspot.com/2008/11/introducing-amibridge.html Intro Amibridge], [http://www.youtube.com/watch?v=ee2PWvCZeLo Old Amiga Apps], [http://www.youtube.com/watch?v=ee2PWvCZeLo Why Janus UAE is good],
::[https://www.youtube.com/watch?v=VhlsNSYSuDg DPaint tutorial]
::[http://vmwaros.blogspot.com/2009/11/can-icaros-play-my-amiga-games-and-why.html Play Amiga Games], [https://www.youtube.com/watch?v=XTaZCNOvCnE],
::[http://www.youtube.com/watch?v=tMehS77LXQ4 Pagestream Introduction], [http://www.youtube.com/watch?v=284-w3hTzII Pagestream Tutorial 1], [http://www.youtube.com/watch?v=mlwEGwhZzl4 Pagestream Tutorial 2],
::[http://www.youtube.com/watch?v=iIcrIjPOctc Catweasel Mk4 PCI Part 1] and [http://www.youtube.com/watch?v=BaitHeL6bEA Part 2],
:08. '''Misc and History'''
::[http://www.youtube.com/watch?v=d6mDXKU29w0 Mum uses old AmigaOS Workbench 1.1 (1986)], [http://www.youtube.com/watch?v=DaRkacQ-YMg Why an Amiga 500 (1987)], [http://www.youtube.com/watch?v=k5CYsgVCzYY an Amiga 2000 (1987)],
:09. '''Misc Shows and Events'''
::[http://www.youtube.com/watch?v=klgVSWKs4kE VCF 2010], [https://www.youtube.com/watch?v=eQ3d5qR-Hv8 24:06 Jason McMullan at amiwest 2012 about AROS], [https://www.youtube.com/watch?v=jpQO7XSfAv4 Aros SMP multi core amiwest 2013], [], [https://www.youtube.com/watch?v=gFRtAAmiFbE], [https://www.youtube.com/watch?v=DjdUEyjx8GM], [https://www.youtube.com/watch?v=ydYDqZQpim8], [], [https://www.youtube.com/@uminekoshouten/featured], [https://www.youtube.com/shorts/NfoY023w-vE],
:10.
::[https://www.youtube.com/shorts/6qJTNW4-6GY]
===History===
The project was originally started by a small group of Amiga [http://www.amigahistory.co.uk/aros.html enthusiasts] in 1995. These individuals were mainly computer-based college university students at the start, though that student trend has diminished since. An interview with Aaron Digulla [http://arosshow.blogspot.com/2006/12/interview-with-aaron-digulla-who.html here]
* 1992 Commodore folds
* 1996-1998 much of the early years was concerned with exec, dos and intuition libraries.
* Early 1999, Haage & Partner used parts of the AROS code in AmigaOS 3.9.
* March 2001, floppy disk images of AROS became available.
* Early 2002, AROS changed its name from Amiga Replacement Operating System to Amiga Research Operating System
* June 2002, AROS devs decided to use Zune (MUI 3.8 rewrite) as the GUI system.
* November 2002, Eric Schwartz drew Kitty for AROS usage.
* Early 2003, AROS.org underwent a graphics facelift.
* Late 2003, GCC C compiler arrived.
* Early 2004, Aros-Exec opened.
* Early 2005, Aros Max bootable CD arrived.
* Late 2005, SFS filesystem ported and allowed fast access to apps and network support arrived
* Early 2007, AROS.org underwent another graphics facelift.
* Mid-2007, AROS changed to AROS Research Operating System after A.Inc. sued Hyperion with a trademark violation.
* Late 2007, the hard disk installer added and VmwAROS (later called Icaros Desktop) distro launched.
* Early 2009, Our first usable web browser (OWB)
* September 2010, first wireless support appears and AspireOS started as a distro
* Early 2012, the first paper-cut bugfix and Fab's Odyssey Web Browser ported
* Early 2017, work started on utilising the addition cores on modern CPUs starting with the 64bit x86 PC version
* Mid-2017, m68k port optimized for the Vampire 2 / Apollo accelerators (68080 AMMX FPGA)
* 2018 The old AROS Exec website closed and a new one opened
* 2019 AROS One x86 32bit distribution started and now with USB install version
* Early 2021, backport of more features of 32bit PC ABIv1 into 32bit PC ABIv0 (Aros One 1.5 and above)
* 2025 year of 64bit pc builds and porting 32bit applications to 64bit ABIv11
* 2026 update of [https://www.youtube.com/watch?v=6FKTL068ULM&pp=ygUPYXJvcyBhbWlnYSAyMDI2 nvidia nouveau driver for 64bit PC]
===Bounties===
To help inspire developers with both ideas and monetary incentives, rewards are offered for the successful completion of "bounties" (requests for missing/new functionality) chosen by the community and handled by [http://power2people.org power2people] (formerly done by TeamAROS). A monthly option is [http://www.power2people.org/funds/aros/ here].
Future goals for AROS include expanding its underlying retargetability to support even more diverse architectures, provide memory protection features and user level file security, SMP and many other wonderful features missing from AmigaOS — while still providing as much source level compatibility as is possible (however it is accepted that to achieve some goals code certain things may require a little recoding).
[http://www.ohloh.net/p/aros/contributors Developers] come and go as with any open source effort and we would like to thank them for their efforts...
;1996-2000:In DigullaA (coordinator), GripJ, TempletonI (BSD), SchulzM, RittauS, voordenDagL, HolmM, JohanssonT, VanIngelgomH, SteigerwaldM, BortasP, deJongK, AlfredssonJ, InnocentiB,
;2001-2005:In [http://chodorowski.com/adam/aros.html ChodorowskiA], StegerG, BergerS, HeutlingS, AlemagnaF (gcc), VerhaegenS (rexx), KielH, MatheussenKS (CAMD), SzczygielskiP, ErikssonP, LeCorfecD (Zune), BauerS (Zune), FurlongW, GustafssonJ, AndrewsN, CafferkeyN, GierichM (jpeg), PattonJ, ParsonsM, DietrichJ, SeilerT, BischoffL, LorentzenNH, AdamO, BerglundH, SmithP, HolmenD, BlomM,
;2006-2010:In FedinP, RusslerM, SzymczykS (owb), SmiechowiczK (openGL), WeissM, NorrisR, BrunnerO, WiszkowskiT, GreppinA, [http://www.fukt.bsnet.se/~bearsoft/ Bearsoft Björn Screwelius], ErbY, CharletF, HodgesC, [http://aros-exec.org/modules/newbb/viewtopic.php?topic_id=4819&forum=18&post_id=43103#forumpost43103 HokstadV], McMullanJ (m68k), WilenT (m68k),
;2011- :In MuijzenbergPHvanden, ALB42, JonesEM, weiju, DizzyofCRN, wawa, miker,
* 1996 - The linux hosted version for i386 was the first to arrive
* 1998 - i386, The native version for i386-based PC AT computers and compatibles.
* 2004 - x86/64, The native version for 64-bit (x86_64, amd64) PC computers.
* 2008 - sam440/ppc, The native version for Sam440EP, Sam440EP Flex and Sam460ex computers.
* 2009 - efika, The native version for PowerPC Efika computers.
* 2010 - m68k, The native version for m68k Amigas or WinUAE
* 2013 - raspi/armfh, early native version for ARMv6 based Raspberry Pi computers.
* 2017 - x86/64bit smp
Debugging capture serial debug at all (especially with sysdebug=all or --sysdebug=all) to see it displayed on screen
* yes, usb -> rs232 adapters can work most of the time, some of the cheapest ones are not fully compatible with all rs232 devices to capture to another device
* you will need a null modem cable (or a null modem adapter usually female to female) in addition to the usb -> rs232 adapter (usb adapter is a normal modem ie. the pins are not crossed over)
Normal modem cable - straight connection DCE
<pre>
Pin 2 -> Pin 2 RXD
Pin 3 -> Pin 3 TXD
Pin 5 -> Pin 5 GND
</pre>
Null modem cable connections DTE
<pre>
Pin 2 -> Pin 3
Pin 3 -> Pin 2
Pin 5 -> Pin 5
</pre>
(9pole SUB-D)
<pre>
serial ser: (amiga/aros) tty2 tty1USB0 (linux) COM1 (windows) (depends on the os being used)
speed baud transfer rate 9600 38400 lower baud might be more successful
data bits 8
stop bits 1
parity none
handshaking flow control - none xon/xoff (most likely) rts/cts dsr/dtr (pins not connected so should not work)
</pre>
*You cannot use compiled aros X86-64 bit software (when ready) on aros X86 32bit. PPC compiled software on X86 and so on.
*68k is tested with the UAE emulator (WinUAE) but some tests are done on native 68000 based Amigas and others.
*PPC support is very limited to certain devices.
If you use the WBStartup, you have to delete the other icons in the folder (readme etc..) and you have to add in the Icon Tooltype the parameter DONOTWAIT
If you use user-startup instead, you need to add the attached command "after assignment to LUA"
C:WBRun DH1:Extras/Utility/WeatherBar/WeatherBar >NIL:
Change the command to match your WeatherBar path.
<pre>
PATH sys:Utilities/WeatherBar ADD
run >nil: lua:amilua weatherforecast.lua
</pre>
To enter data your Country or City, ist with city_id numbers can be found [http://bulk.openweathermap.org/sample/city.list.json.gz here] or you need to go to [https://www.bbc.com/weather BBC Weather], once you type the name of your city or town in the appropriate tab, and press enter, the 7 numbers to be added in the "WeatherBar" will appear on the Browser url address bar above
Unicode v16.0 emojis are not supported but [https://github.com/jens-maus/libcodesets codesets.library] provides
<pre>
internally supported (hardcoded) charsets/codesets are: (conversions are possible from and to each codeset):
AmigaPL – Polish (Amiga)
Amiga-1251 – Cyrillic (Amiga)
ISO-8859-1 – Western European
ISO-8859-1+Euro – West European (with EURO)
ISO-8859-2 – Central/East European
ISO-8859-3 – South European
ISO-8859-4 – North European
ISO-8859-5 – Slavic languages
ISO-8859-9 – Turkish
ISO-8859-15 – West European II
ISO-8859-16 – South-Eastern European
KOI8-R – Russian
UTF-8 – Unicode
In addition, external charset table files can be stored in LIBS:Charsets or loaded by an application from PROGDIR:Charsets. The charset files included with this distributions are:
IBM866 – Cyrillic (cp866)
ISO-8859-7 – Greek (LatinGreek)
ISO-8859-10 – Nordic (Latin 6)
windows-1250 – Central/East Europe (Windows)
windows-1251 – Cyrillic (Windows)
windows-1252 – West European (Windows)
</pre>
Icaros 2.3 USB image needs a header stripped so it can work correctly
dd bs=512 skip=1 status=progress if=icaros_light_2-3-0_pendrive.bin of=/dev/sdxy && sync
Scalos
<pre>
-------------------------------
{ "STRING", "ID/K,TEXT/K,SRC/K,TEXTPEN/K,HALIGN/K,STYLE/K,FONT/K,VALIGN/K",
HALIGN LEFT | CENTER | RIGHT
VALIGN TOP | CENTER | BOTTOM
STYLE NORMAL | BOLD | ITALIC | BOLDITALIC
FONT // font specification - format: "fontname.font/size"
-------------------------------
arguments for STRING SRC
"diskstate",
"diskusage",
"diskusagefree",
"diskusageinuse",
"diskusagepercent",
"fibfilename",
"filecomment",
"filedate",
"fileprotection",
"filesize",
"filetime",
"filetypestring",
"iconname",
"linktarget",
"plugin" pluginname <optional plugin arguments>
"versionstring",
"volumecreateddate",
"volumecreatedtime",
"volumeordevicename",
-------------------------------
arguments for HIDE
"novolumenode",
"isempty" (some STRING)
-------------------------------
all internal commands:
"about",
"backdrop",
"cleanup",
"cleanupbyname",
"cleanupbydate",
"cleanupbysize",
"cleanupbytype",
"clearselection",
"clone",
"close",
"copy",
"cut",
"delete",
"emptytrashcan",
"executecommand",
"formatdisk",
"iconify",
"iconinfo",
"lastmsg",
"leaveout",
"makedir",
"open",
"parent",
"paste",
"putaway",
"quit",
"redraw",
"redrawall",
"rename",
"reset",
"selectall",
"showallfiles",
"showonlyicons",
"shutdown",
"sizetofit",
"snapshot",
"snapshotall",
"snapshotwindow",
"unsnapshot",
"update",
"updateall",
"viewbydate",
"viewbyicon",
"viewbysize",
"viewbytype",
"viewbytext",
</pre>
{{status|50%}}
{{BookCat}}
btz3uq990chnk5h5yiebu1nd5rie0ko
Aros/Developer/Docs
0
13107
4669602
4669508
2026-09-10T14:10:54Z
Jeff1138
301139
4669602
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
Curly brackets missing - try SHIFT + ALT + 7 or 0.
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, armPi-64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" what ABI (ABIv1 or for PC forks ABIv11 or ABIv0)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
3p3zqiif9nb1u53ljz72igies9xlmv3
4669653
4669602
2026-09-11T09:45:46Z
Jeff1138
301139
4669653
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
Curly brackets missing - try SHIFT + ALT + 7 or 0.
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, armPi-64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" what ABI (ABIv1 or for PC forks 64bit ends in ABIv11 or 32bit ends in ABIv0)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
fu7c1ytvldgy6qx6mfk4jrvl9qc7fsr
4669654
4669653
2026-09-11T09:48:15Z
Jeff1138
301139
4669654
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, armPi-64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" what ABI (ABIv1 or for PC forks 64bit ends in ABIv11 or 32bit ends in ABIv0)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
lz4wfmb69pd06yf111r6xy86mcx6ejh
4669655
4669654
2026-09-11T09:50:55Z
Jeff1138
301139
4669655
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, armPi-64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" the ABI (ABIv1 or for PC forks 64bit ends in ABIv11 or 32bit ends in ABIv0)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
mpgohk3gjy1b8gnz0ograg9xp0qem72
4669657
4669655
2026-09-11T09:52:25Z
Jeff1138
301139
4669657
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, armPi-64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" the ABI (ABIv1 leave blank, for PC fork 64bit ABIv11 ends in v11 or 32bit ends in ABIv0)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
m0xhzivpzlv1rg5ew6v9ciz2pauevzd
4669658
4669657
2026-09-11T09:55:41Z
Jeff1138
301139
4669658
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, armPi-64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" the ABI (ABIv1 leave blank, for PC fork 64bit ABIv11 ends in v11 or 32bit ends in i386-aros)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
8a6xltncugui32y0cll0xl20ctgslii
4669659
4669658
2026-09-11T09:58:59Z
Jeff1138
301139
4669659
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, aarch64 etc.) in the archive name
and it is also advisable to write in the field "Requirements" the ABI (ABIv1 leave blank, for PC fork 64bit ABIv11 ends in x86_64-aros-v11, 32bit ends in i386-aros, Arm Pi ends aarch64-aros)
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
seup6vhmqc1pw1lm44taxapgimyr4in
4669660
4669659
2026-09-11T10:10:23Z
Jeff1138
301139
4669660
wikitext
text/x-wiki
{{ArosNav}}
==A technical overview of AROS==
Google translation [http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Italian], [http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fwiki%2FAros%2FDeveloper%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Polish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FDeveloper%2FDocs Portuguese]
{{Uncited}}
AROS,<ref>[http://aros.sourceforge.net/download.php References and sources]</ref> like AmigaOS (TM), is a [[w:Message passing|message-passing]], [[w:Preemption (computing)|preemptive]] [[w:Multitasking|multitasking]] [[w:Operating system|OS]].
It uses [[w:Reentrant (subroutine)|re-entrant]] shared libraries to save memory space.
AROS is based around an executive library kernel (Exec) and two other libraries:
* Exec (the "kernel", which is not a kernel in the modern sense),
* Intuition (graphics and GUI, integrated into the system) and
* AmigaDOS (Disk Operating System, the Metacomco's Tripos modified to work with Exec).
The design philosophies of AmigaDOS and Intuition are rather different, the former adopting a C-like API and the latter creating an [http://www.basden.demon.co.uk/amiga/amiga.oo.html object-oriented], message passing aware environment for the programmer. The system base is the only absolute address in AmigaOS (located at 0x00000004) this does differ with AROS as AROS SysBase is automatically provided (no $4) but everything else is dynamically loaded. The OS is well known for delivering high performance due to its close connections with the hardware, while simultaneously having the flexibility to support re-targetable graphics (Cybergraphics) and retargetable audio subsystems (AHI).
: Diagram showing relationships of libraries to system needed
Remember, AROS is a [http://en.wikibooks.org/wiki/Aros/Developer/ABIv1 research] operating system, and while all contributions to the base AROS code are welcome, please contact the dev list first for any core changes. Writing applications for AROS does not have this requirement.
While AROS appears and feels almost feature complete, it is still [[Aros/Developer/IncompleteAPIs|missing a small number of functions]] from the Amiga API.
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1201 This thread provides] information for setup, [http://www.aros.org/documentation/developers/index.php documentation] and whether you are interested in core OS changes and/or writing/porting software apps
*you compile directly under AROS, which can be running on either real hardware, virtual hardware
*in hosted mode under linux/window, cross-compile from that host OS (save your files as ISO-8859-15 encoding instead of UTF-8) [https://github.com/BlitterStudio/aros-compiler-docker Docker images]
'''The repository''' for 64bit and 32bit ABIv1 all hardware platforms is [https://github.com/aros-development-team/AROS current development version].
There are many forks of this so that developers can work on their own and forward changes at a later date as discussed on the dev forum
64bit PC is one of two hardware platform with another fork called [https://github.com/deadwood2/AROS abiv11] which is used for Aros One x64 PC
32bit PC is the other fork [https://github.com/deadw00d/AROS/tree/alt-abiv0 repository for current stable PC version ABIv0 with backported ABIv1 features is located which is used on AROS One and Icaros x86 32bit based distros] this is for historic reasons
Any [https://github.com/aros-development-team/AROS/issues bugs / issues can be added for ABIv1 issues]. The two individual PC forks have their own issues tab on their github webpages
We have a [https://arosdevteam.slack.com/archives/CUFV48U3H slack here], discord on [https://discord.gg/UKp9qdEBuQ Discord@AmigaDev],
==Software Development for AROS==
===Programming languages===
====Common to all====
'The Developer Environment', which primarily supports C/C++ code, there are other scripting programming languages available
:[[Aros/User/DOS|DOS]]
:[[Aros/Developer/Docs/LUA|LUA]]
:REXX [[Aros/Developer/Docs/Rexx|Regina (AROS' ARexx)]]
====Needs to be compiled/ported====
::[[Aros/Developer/Docs/LLVM|LLVM]]
::Python [ Info], [],
::[https://ae.arosworld.org/index.php?board=11.0 FreePascal FPC Aros-Exec thread], [https://archives.arosworld.org/index.php?function=browse&cat=development/language fpc arm here is very old and will not work], FreePascal for AROS has its own [http://fpcaroswiki.alb42.de/ Wikibook],
::[http://sourceforge.net/projects/xamos/ X-Amos Basic]
::[http://sdlbasic.sourceforge.net/ SDLBasic] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[[Aros/Developer/Basic/Basic4SDL|Basic4SDL]] ([https://archives.arosworld.org/index.php?function=browse&cat=development/language ])
::[http://alvyn.sourceforge.net/ Alvyn] ([http://www.dusabledanslherbe.eu/AROSPage/MISC.14.html download])
::[http://www.airsoftsoftwair.com/ Hollywood when enough users warrant a port - paid one time fee language]
::[[Aros/Developer/Docs/E|AmigaE Portable E]]
====Hardware Restricted====
'''Basic'''
:[http://amos.pspuae.com/AmosProManual/contents/c1.html '''Amos Pro'''] [http://amos.pspuae.com/index.php?action=forum#1 compatible] [http://www.amigacoding.com/index.php/Main_Page commands] (all incomplete)
:'''Blitz Basic''' [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=46537#forumpost46537 none on AROS]
:: [http://www.amiforce.de/main.php Amiblitz] on amiga(TM) emulator
:'''Amiga Basic'''
:: [ ACEBasic]
'''Misc'''
:Ruby [http://www.ruby-lang.org/en Info]/[https://archives.arosworld.org/index.php?function=browse&cat=development/language Ruby 32bit PC],
===Where to get the C/C++ Environment===
If you want to develop for AROS, its generally easier to be running linux hosted AROS development environment especially for C++, cross compiling the code. That's how most developers now are doing it. g++ is used to compile owb web browser as well as some other AROS software. If you were hoping for a rich set of C++ libraries or classes defined for the OS feature set, you might be disappointed.
AROS Native compiling is possible, but you're much more likely to run into the odd bug(s) in the dev environment since it gets little testing and fixing by other developers.
Is there a sftp software or scp over ssh available?
Maybe. At least the security part would be handled by [https://github.com/jens-maus/amissl amissl] [https://archives.arosworld.org/index.php?function=browse&cat=network/misc port]. [https://github.com/BlitterStudio/dopus5 DOpus5] has recently added sftp support. See here for a [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1974&highlight=ssh&pid=12073#post_12073 ssh scp client]
[https://arosdevteam.slack.com/join/shared_invite/enQtOTc4Mzg0NDIzNzQ0LWQ2NWZmNmMwNGIwNGEyNTgxNzU3MGFjMTk3ZThmOTQ1MTVjMzhmNTllYWQ0ZTUxMjBjMGE0Y2VjMDJmNTc5MzI#/shared-invite/email Slack Dev Forum]
====Cross compilers from Windows or Linux====
*Windows WSL2 walkthrough can be [https://arosnews.github.io/how-to-cross-compile-aros-hosted-wsl/ found here]
you want to build AROS. No problem.
Here are instructions for PC 64-bit:
https://github.com/deadw00d/AROS/blob/master/INSTALL.md
Here are instructions for PC 32-bit:
https://github.com/deadw00d/AROS/blob/alt-abiv0/INSTALL.md
And as always has been the case you can use the contrib archive to 'obtain' the development directory which contains the /native/ AROS gcc compiler and tools. That compiler is used to build AROS itself but can be used outside the AROS build process by providing --sysroot with indicated directory to cross compile for AROS.
'''64 bit'''
'''32 bit'''
A good option for multiple OS is [https://axrt.org/index.php?tab=download-aros AxRuntime lets developers compile their Amiga API-based applications as Linux binaries being able to utilize modern development tools available on Linux, like IDEs, debuggers, profilers, etc]
Older 32bit guides for Linux hosted compiler
Please install these packages before moving to next step. Below is a reference list for Debian-based distributions. Reference build system was Ubuntu 18.04/20.04 amd64.
subversion git-core gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libx11-dev libxext-dev libc6-dev liblzo2-dev libxxf86vm-dev libpng-dev gcc-multilib libsdl1.2-dev byacc python-mako libxcursor-dev cmake zsh mingw64
Do all of these operations under home directory of your user or another directory where your user has write permissions.
Specifically, in a section "Linux-i386", be sure first to build the cross-compiler (toolchain-alt-abiv0-i386) and only then AROS itself (alt-abiv0-linux-i386).
Clone & build
<pre>
$ mkdir myrepo
$ cd myrepo
$ git clone https://github.com/deadw00d/AROS.git AROS
$ cd AROS
$ git checkout alt-abiv0
$ cd ..
$ cp ./AROS/scripts/rebuild.sh .
$ ./rebuild.sh
</pre>
Now to the build selection below - Linux-i386
Select toolchain-alt-abiv0-i386 - Select alt-abiv0-linux-i386 (DEBUG)
Start AROS by:
<pre>
$ cd alt-abiv0-linux-i386/bin/linux-i386/AROS
$ ./Arch/linux/AROSBootstrap
</pre>
Pc-i386 Select toolchain-alt-abiv0-i386 (if not built yet) - Select alt-abiv0-pc-i386
ISO image available in alt-abiv0-pc-i386/distfiles
Now that we have linux-hosted build, we can resume native (option 2).
Run ./rebuild.sh and selection option 2. Wait until it finished, then:
<pre>
$ cd alt-abiv0-pc-i386
$ make
</pre>
Now
<pre>
$ make bootiso
</pre>
Now, your compiler is located in toolchain-alt-abiv0-i386 directory and named i386-aros-gcc. Includes are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/include and libraries are in alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development.lib.
This is how then can be passed to the compiler:
/home/xxx/toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot /home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development -L/home/xxx/alt-abiv0-linux-i386-d/bin/linux-i386/AROS/Development/lib
../toolchain-alt-abiv0-i386/i386-aros-gcc --sysroot bin/linux-i386/AROS/Development local/helloworld/helloworld.c -o local/helloworld/helloworld
Another method was using Debian like distros and download the gimmearos.sh script (on [http://archives.aros-exec.org/index.php?function=browse&cat=development/cross aros-archives]) to setup the developer environment by downloading necessary packages ...
The gimmearos script is a good start in that direction, building the cross compilers and hosted AROS environment, but gimmearos.sh might be out of date or not be completely compatible with any given linux distro.
In order to do that, you have to compile AROS yourself. Download AROS source archive not contrib. Compile AROS by entering the main directory
./configure
make
([http://aros.sourceforge.net/documentation/developers/compiling.php More on compiling AROS]). The result will be a basic AROS system without development tools.
To compile C++ on Linux, type 'make gnu-contrib-crosstools', creating the cross-compilers in ./bin/linux-i386/tools/, named i386-aros-gcc, etc.
'''Note''': Currently, to make the cross compilers usable copy 'collect-aros' from tools/ to tools/i386-aros/bin/. At the moment the cross compilers if used from the Linux command line will only find it when it's there.
If you want to compile native compilers (the Developer Environment), type 'make contrib-gnu-gcc', creating native compilers in AROS' System:Development/bin directory.
When the output needs to be stripped <code>--strip-unneeded --remove-section .comment</code>
The Obj-C backend should build out of the box.
Open contrib/gnu/gcc/mmakefile.src and search for the line which contains "--enable-languages" and add "objc" to the list of languages that follows it.
--enable-languages=c,c++,objc
Better make it—enable-languages=c,c++,objc,obj-c++
ObjC++ is broken as soon as you try to use exceptions, but that might change in future GCC versions and it does not hurt having it there already.
Do you need a cross-compiler or a real compiler? In the first case you can get away with just downloading the proper gcc archive, apply the patch and proceed with the normal gcc build. In the case of a real cross-compiler then when downloading the contrib sources, also need to download the normal sources, place the contrib sources into a directory called contrib, need to install autoconf+automake+perl+python, call ./configure, cd into the subdirectory and type make.
to rebuild GCC with host == build == target == i386-pc-aros. So just get the vanilla sources and apply the patches without bothering about the build system?
[https://vmwaros.blogspot.com/2019/10/a-pre-configured-development-machine.html pre-configured VM environment vmware virtual machine to develop AROS and AROS software]
====Native compilers for AROS====
Namely gcc for C or g++ for C++ are supplied with the [[Aros/Developer/Docs#The Developer Environment|Developer Environment]], which is already '''setup''' and part of any current AROS distribution like AROS One or the nightlies
* Current GCC 6.5 (32bit) though moving to 10.5 and 15.1 (64bit)
* Older software components. GNU GCC 4.x GNU BinUtils, GNU Fileutils 4.x, GNU Textutils and others usually deprecated
On single partition systems and the Boot ISO, the AROS Developer environment is installed under "SYS:Development/". Systems with multiple partitions - such as a Work: partition - tend to install it to there instead, however it can be installed manually to any location. Please remember, if moving, that you will need to correct the Development packages 'install location' env variable to point to the new locations root - look in SYS:S/startup-sequence.
<pre>
Assign Development: SYS:Development
Assign C: Development:bin ADD
</pre>
In the aros build instructions. you need to check out contrib and/or ports into your AROS source directory, as subdirs. then, assuming you are building in an external build dir, as you should, you simply configure and "make contrib" for instance or whatever submodule you might want to build.
===Beginners Tutorials in C C++===
As AROS is [http://eab.abime.net/showthread.php?t=29856 C based] API compatible to AmigaOS 3.x, so most of the information on programming C on the Amiga applies to AROS as well. Please note that there is a lot of AmigaOS 1.3 (1985-1989) and [https://www.markround.com/amigaguide AmigaOS AOS 2.x (1990-1992)] information around but OS3.1 is recommended but limited in amount.
Brief overview of what is required to write AROS Applications
# Using [[Aros/Developer/Docs/Libraries/Intuition|Intuition]] for basic screens/windows
# Using graphics within windows via 8bit [[Aros/Developer/Docs/Libraries/Graphics|graphics]] and so onto 15-16-24bit [[Aros/Developer/Docs/Libraries/CGFX|cybergraphx]]
# Load and save work to [[Aros/Developer/Docs/Libraries/DOS|dos]] disk drives
# Using the [[Aros/Developer/Zune|ZUNE GUI Environment]]
Writing native games require this extra information
# Using [[Aros/Developer/AHIDrivers|AHI audio hardware independent API]]
# Using USB joystick/joypad with the Poseidon USB stack through [[Aros/Developer/Docs/Libraries/LowLevel|LowLevel]] library
Additional features that could be added later
# Adding additional [[Aros/Developer/Docs/Libraries/Locale|Locale]] language translations to your program
# Adding a [[Aros/Developer/Docs/Rexx|AREXX/Regina]] port to your application
# Executing Amiga(TM) [[Aros/User/DOS|DOS]] commands from your application
# Using [[Aros/Developer/Docs/Libraries/Icon|icons]] (.info files) and icon tooltypes (stack, version, and program startup options)
# Local couch or IP based SANA2 networking co-op multi player gaming support
Most AmigaOS programming books are nowadays very much out of date as most are from the late 1980s and do not cover later amigaOS releases like 3.1 for example, Rob Peck's book "Programmer's Guide to the Amiga". The Amiga ROM Kernel manuals aka RKMs like Libraries (3rd edition), Devices (), the AmigaDOS manual (3rd edition) and the Style Guide may have their uses. There are some reference examples from AmigaMail and Devcon notes (available again on an Amiga developers CD 2.1).
For Arexx then "The Amiga Programmer's Guide to ARexx" by Eric Giguere, which was published by Commodore is useful as well as an "Arexx Cookbook".
* Beginners C Guide [http://www.iu.hio.no/~mark/CTutorial/CTutorial.html C Tutorial],
* [http://www.pjhutchison.org/tutorial/amiga_c.html Amiga based but interesting]
* [http://thecguru.com/ C for beginners],
* [http://fresh2refresh.com/c/c-basic-program/ C programming basics] for students,
* [https://www.edx.org/courses Free Online course] from American Universities
* Reference Amiga [http://amigadev.elowar.com/ API reference].
* AROS based c source can be found [[Aros/Developer/Docs/Examples|here]] and lots of example code can be found inside [https://github.com/aros-development-team AROS sources] themselves and from the contrib section of the archives from [https://github.com/aros-development-team/contrib Aros site], and study the AROS applications source code, e.g. the test programs from the Tests drawer (folder/directory). Take a look at the code of some smaller AROS programs might be a better and more up to date
When you upload your builds, please write the architecture (like i386-aros, x86_64-aros, aarch64-aros etc.) in the archive name
and it is also advisable to write in the field "Requirements" the ABI (ABIv1 leave blank, for PC fork 64bit ABIv11 ends in v11, 32bit ends in , Arm Pi ends )
===Compiling C/C++ Code===
Native, although we have a IDE Integrated Development Environment (Murks), it does lack a debugger. Whilst others use a combination of a text editor and shell to edit code. Most though use an AROS hosted on Linux to take advantage of the better GCC tools like GDB and various IDEs.
Open shell - its a menu option at the top left of Wanderer (desktop). Or by using the right Win key and w (or F12 and w) within the directory with the source code. Type in
sh
to change the amiga shell into a unix shell. You can then type in ls (unix equivalent to amiga dir). Take a look [http://en.wikibooks.org/wiki/Linux_commands here] for more commands.
For a single file program-name.c or program-name.cpp
gcc -o program-name program-name.c
or
g++ -o program-name program-name.cpp
or
g++ -o test -Wall -g main.cc texturelib.cpp xmodelib.cc -lsdl -lgl
To close the shell, click on the top left-hand corner to close (twice). Once to get back the aros shell and then again to close finally. Use [http://freshmeat.net/projects/cksfv/ cksfv] as a test.
Some source code requires the addition of Amiga API libraries, like dos, which you can flag at the compile time as
gcc -o julia.exe julia.c -ldos
For DOS use -ldos as example and if you are compiling mui codes it will be -lmui or intuition -lintuition. Other missing symbols are due to linker libraries being necessary for linking in functions that aren't in the standard C libraries. For example some source code would need added
-lz or -lm or -lpng or -larosc etc.
use this in unix line command mode to search for 'search-item' in many .c files (*.cpp for c++, etc.)
grep -l 'search-item' *.c
If the program is not executable, try using parameter fno-common
"Delete #?.o"? Or if you are using abcshell then "rm *.o"
:''More information: [[Aros/Developer/Porting software]]''
=== How to make Apps have AROS 64-bit specific support code ===
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
AROS64 already uses 64bit addressing, it just doesn't setup the MMU for more than 4GB physical memory currently.
When porting software to AROS64 it is "mostly" a case of converting ULONG's that are used to store pointers, into IPTR's instead, etc. Another quirk, is making sure items on the stack are the correct size by using the STACKED attribute for them.
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
compiling mui stuff for aros setting -std=gnu99 is necessary, had -std=c99 usually
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order.
crash which suggest memory corruption. From my experience porting from 32-bit to 64-bit these kinds of errors can happen if a pointer is passed somewhere via ULONG variable. Then half of the pointer is cut.
To generate this error, please run AROSBootstrap with -m 1024. This will allocate heap to 64-bit address space which will make these errors immediatelly visible. These types of crashes are hard to debug. Disabled as little code as possible to stop corruption from occurring and then try to read from the code where it can be broken
Crashing in tslf_freevec is another symptom of memory corruption and these memory corruptions will manifest differently on different setups.
==Coding conventions==
As the AROS core source is a shared developer experience, there are rules regarding structure and style. When it comes to your creating your own app and coding, the structure and style should be your own, i.e. you should enjoy what you do and do it so that you can understand what is going on.
===Layout===
<syntaxhighlight lang="c">
static void 1st_function()
{
program
exit(0);
}
int main(void)
{
1st_function();
2nd_function();
3rd_function();
return 0;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
struct Screen * openscreen(void);
struct Window *openwindow(struct Screen *screen, const char *title, LONG x, LONG y, LONG w, LONG h);
VOID 1st_function();
VOID 2nd_function();
int main(int argc, char **argv)
{
program
return 0;
} /* main */
VOID 1st_function()
{
}
VOID 2nd_function()
{
}
</syntaxhighlight>
===General style===
This code is used by many people and therefore you should keep some things in mind when you submit source code:
* Keep things simple
* Keep the source clean
* Always know what you are doing, if not flag it and describe what needs to be done...
* Explain clearly/simply what you are doing
* Remember that you write code once but that it is read many times by many people
===Comments===
AROS uses some of the comments in the source to generate the documentation. Therefore it's necessary to keep a certain format so the tools can find their information. Other comments are ignored but they should explain what you thought when you wrote the code. If you really can't think of an explanation, then don't write the code a second time like this:
<pre>
/* This adds 1 to t */
t ++;
</pre>
What we think of is this:
<pre>
/* Go on with next element */
t ++;
</pre>
===Formatting===
This is only '''IMPORTANT''' if you are going to work on the core AROS code or contrib but not applications which may reside outside like on AROS Archives or other websites.
<syntaxhighlight lang="c">
{
/* a */
struct RastPort * rp;
int a;
/* b */
rp = NULL;
a = 1;
/* c */
if (a == 1)
printf ("Init worked\n");
/* d */
if
(
!(rp = Get_a_pointer_to_the_RastPort
(
some
, long
, arguments
)
)
||
a <= 0
)
{
printf ("Something failed\n");
return FAIL;
}
/* e */
a = printf ("My RastPort is %p, a=%d\n"
, rp
, a
);
return OK;
}
</syntaxhighlight>
Looks ugly, eh ? :-) Ok, here are the rules:
<pre>
If several lines contain similar code, put similar things below each other (see a and b);
Put spaces between operands and operators
Put braces {}, brackets [] and parentheses () below each other (d) if there is much code between.
Brackets and parentheses may be in one line if the code between is small (c)
Indent by 4 Spaces. Two indent levels may be abbreviated by one tab.
</pre>
'''Before committing please normalize the indentation - if you have a mixture of tabs and spaced - please always use spaces, 1 tab = 4 spaces.'''
The reasons for this are:
# While some editors can use an arbitrary sizes for tabs, it's a bit complicated to tell another editor which tab size was used by the one used to write the code.
# Most code in AROS was written this way and your code should look like the rest.
# You can print this code on any printer without special tools to "fix" the tabs.
# Most editors have smart tabs which do exactly this. If your editor doesn't, write a bug report.
If you have a function with many arguments (d, e) you should put the parentheses in lines of their own and each argument in one line (d) or put the first argument behind the opening parentheses (e) and each following argument in a line of its own with the comma in front. The closing parentheses is in a line of its own and aligned with the beginning of the expression (i.e. the a and not the opening parentheses or the printf()).
Use a single blank line to separate logical blocks. Large comments should have a blank line before and after them, small comments should be put before the code they explain with only one blank line before them.
If you see any TABS in AROS core sources then the suggestion is to "detab the file and commit that separately" either before or afterwards from making functionality changes. Make two commits instead of one. This makes it easier for others to see the real changes instead of having to dig through multiple lines of irrelevant diffs.
===Eliminating Global Variables===
i.e. pass variables to functions (local scope) or classes making it easier to track and debug your code.
Any time you find that you need a particular thing in 'a lot of different places', chances are that all those places are conceptually related, and so you can create a class, a namespace, a function, or some other higher-level organizational unit to represent that relationship. This makes the program easier to understand.
Bad Designs
* All variables are global.
* There are no standalone functions, only sub-procedures which act on the global variables.
* Every sub-procedure is at least 500 lines to several thousand
* Every sub-procedure has more than one task to perform
* Copy-paste is preferred to writing methods, AND subtle changes are made in the middle of the code
Good Designs
* structure program into functions (C or basic) - top-down procedural approach
* put in class(es) (freepascal or C++) - the object is fixed and you use methods to access the object
<pre>
class String_List
{
private:
list<string> m_List; // member
public:
void read_strings() { /* read strings into m_List */ }
void print_strings() { /* write contents of m_List to stdout */ }
void sort_strings() { /* sort contents of m_List */ }
void sort_strings_reverse() { /* reverse-sort contents of m_List */ }
void unique_strings() { /* remove duplicate strings */ }
};
int main()
{
String_List myList; // local
myList.read_strings();
myList.sort_strings();
myList.print_strings();
myList.sort_strings_reverse();
myList.print_strings();
myList.unique_strings();
myList.print_strings();
return 0;
}
</pre>
This way it is very easy to replace the list with new list for debugging purposes, or replacing the methods without replacing the list, when you want different results. You only have to replace the content of the local variables.
So create the structure that matches your data (linked lists, trees, arrays, etc.) and what to do with them (sorting, searching, etc.)
<pre>
.h usually contain #define #include typedef enum struct extern screen and window definitions (data structures)
.c should contains functions and algorithms
</pre>
One way to look at it is that menu headings act as the .c file and sub-menu headings as functions.
When you start a project, you place a couple of declarations in the include file. As the project continues, you place more and more declarations in the include file, some of which refer to or contain previous declarations. Before you know it, you have a real mess on your hands. The majority of your source files have knowledge of the data structures and directly reference elements from the structures.
Making changes in an environment where many data structures directly refer to other data structures becomes, at best, a headache. Consider what happens when you change a data structure.
Use good variables names to help clarify code and only comment when you need to explain why a certain programming approach was made.
You're Refactoring Legacy Code, you see a global, you want to get rid of it. How do you do this?
Exactly what to do depends on how the global is used. The first step is to find all uses of the global throughout the code, and get a feel for what the significance of the variable is and how it relates to the rest of the program. Pay particular attention to the "lifetime" of the variable (when it gets initialized, when it is first used, when it is last used, how it gets cleaned up). Then, you will probably make the global a data member of a class (for OO languages), or you will write some get/set functions. Converting to the Singleton Pattern is common, but you may discover that it makes more sense for the data element to be a member of an existing singleton, or maybe even an instance variable.
# Create a basic read method, either as a class or a global function. Replace all reads with the access method, but leave the variable defined as a global.
# Review each of the writes to the method and extract action functions one at a time. Unless two operations are coded identically in the original code, extract each write access separately.
# Change the variable scope from global to local.
# Analyze similar action functions to determine if any can be merged, i.e., there are no functional differences in the results of the function, just differences in the implementation details.
# Review the calls to the read method and see if a more complex functionality should be applied. Follow the approach for writes and unless implementations are identical, create separate access functions.
# Analyze the access functions for duplication.
As returning variables by "passing by value" are forgotten, so "passing by reference" is often used instead. The reference is a pointer to the variable so the value is remembered when returned.
Alternatives
* Hidden Globals
* Singleton Pattern
* Database or TupleSpace
* Context Object
* Dependency Injection
* Stateful Procedures
==AROS/AmigaOS APIs and Docs==
<pre>
Library:
- Private data structure
- Many public access methods
Device:
- Private data structure
- Two (BeginIO/AbortIO) access methods
Resource:
- Public data structure
- *NO* access methods
</pre>
And, being Amiga OS-compatible, there are exceptions to all of these.
===System Libraries===
The [http://developers.aros.org/ AROS Guide To Libraries] can be used as a guide to individual commands and old Dev Docs are used in application programming.
Amiga/Aros styles libraries are very different from windows and linux libs. Typical .so/dll libraries are foreign to most Amiga-like OS
*[[Aros/Developer/Docs/Libraries/AROSC|arosc.library]]
*[[Aros/Developer/Docs/Libraries/AmigaGuide|amigaguide.library]]
*[[Aros/Developer/Docs/Libraries/ASL|asl.library]]
*[[Aros/Developer/Docs/Libraries/Bullet|bullet.library]]
*[[Aros/Developer/Docs/Libraries/BSDsocket|bsdsocket.library]]
*[[Aros/Developer/Docs/Libraries/CAMD|camd.library]]
*[[Aros/Developer/Docs/Libraries/Codesets|codesets.library]]
*[[Aros/Developer/Docs/Libraries/CGFX|cybergraphics.library]]
*[[Aros/Developer/Docs/Libraries/CGXVIDEO|cgxvideo.library]]
*[[Aros/Developer/Docs/Libraries/Commodities|commodities.library]]
*[[Aros/Developer/Docs/Libraries/DataTypes|datatypes.library]]
*[[Aros/Developer/Docs/Libraries/DiskFont|diskfont.library]]
*[[Aros/Developer/Docs/Libraries/DOS|dos.library]]
*[[Aros/Developer/Docs/Libraries/Exec|exec.library]]
*[[Aros/Developer/Docs/Libraries/Expansion|expansion.library]]
*[[Aros/Developer/Docs/Libraries/FreeType2|freetype.library]]
*[[Aros/Developer/Docs/Libraries/GadTools|gadtools.library]]
*[[Aros/Developer/Docs/Libraries/Graphics|graphics.library]]
*[[Aros/Developer/Docs/Libraries/Icon|icon.library]]
*[[Aros/Developer/Docs/Libraries/Identify|identify.library]]
*[[Aros/Developer/Docs/Libraries/IFFParse|iffparse.library]]
*[[Aros/Developer/Docs/Libraries/Intuition|intuition.library]]
*[[Aros/Developer/Docs/Libraries/Keymap|keymap.library]]
*[[Aros/Developer/Docs/Libraries/Layers|layers.library]]
*[[Aros/Developer/Docs/Libraries/Locale|locale.library]]
*[[Aros/Developer/Docs/Libraries/LowLevel|lowlevel.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingBas|mathieeesingbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubBas|mathieeedoubbas.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEESingTrans|mathieeesingtrans.library]]
*[[Aros/Developer/Docs/Libraries/MathIEEEDoubTrans|mathieeedoubtrans.library]]
*[[Aros/Developer/Docs/Libraries/Mathtrans|mathtrans.library]]
*[[Aros/Developer/Docs/Libraries/MUIMaster|muimaster.library]]
*[[Aros/Developer/Docs/Libraries/Partition|partition.library]]
*[[Aros/Developer/Docs/Libraries/PopUpMenu|popupmenu.library]]
*[[Aros/Developer/Docs/Libraries/OOP|oop.library]]
*[[Aros/Developer/Docs/Libraries/Regina|regina.library]]
*[[Aros/Developer/Docs/Libraries/Reqtools|reqtools.library]]
*[[Aros/Developer/Docs/Libraries/RexxSysLib|rexxsyslib.library]]
*[[Aros/Developer/Docs/Libraries/ScreenNotify|screennotify.library]]
*[[Aros/Developer/Docs/Libraries/TTEngine|ttengine.library]]
*[[Aros/Developer/Docs/Libraries/Thread|thread.library]]
*[[Aros/Developer/Docs/Libraries/Utility|utility.library]]
*[[Aros/Developer/Docs/Libraries/Xadmaster|xadmaster.library]]
*[[Aros/Developer/Docs/Libraries/Workbench|workbench.library]]
*[https://github.com/aros-development-team/AROS/commit/c82e86b8480277998014cc327b56c7664023a52f ClassAct Reaction boopsi class]
===AROS Subsystems===
# [[Aros/Developer/Zune|Zune MUI compatible GUI]]
# [[Aros/Developer/AROSAppPackages|AROS Application Packages]]
# AHI Audio Drivers - [[Aros/Developer/AHIDrivers|Usage]]/[[Aros/Developer/AHIDriversDev|Development]]
# AROSTCP Sana2 Network Interface Drivers - [[Aros/Developer/NICDrivers|Usage]]/[[Aros/Developer/NICDriversDev|Development]]
# [[Aros/Developer/AmiSSL|AmiSSL]]
# gfx.hidd/cybergraphics Video Drivers - [[Aros/Developer/GfxDrivers|Usage]]/[[Aros/Developer/GfxDriversDev|Development]]
# IO Device Drivers - [[Aros/Developer/IODeviceDrivers|Usage]]/[[Aros/Developer/IODeviceDriversDev|Development]]
# USB Device Drivers - [[Aros/Developer/USBDrivers|Usage]]/[[Aros/Developer/USBDriversDev|Development]]
# PCI Device Drivers - [[Aros/Developer/PCIDrivers|Usage]]/[[Aros/Developer/PCIDriversDev|Development]]
# [http://www.libsdl.org/ SDL] [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2013&pid=13333#post_13333 SDL2 coding usage], [https://github.com/search?q=repo%3Aaros-development-team%2Fcontrib%20SDL2&type=code SDL2 commits], [https://github.com/aros-development-team/contrib/commit/c62c3c425c35bac19dadc23be092b0b13a66c76c SDL3 initial commit], []
# [[w:Gallium3D|Gallium 3D]] [http://www.mesa3d.org/ openGL aka Mesa] - [[Aros/Developer/OpenGL|Usage]]/[[Aros/Developer/OpenGLDev|Development]] [http://www.swiftless.com/opengltuts.html Swfitless]
# A small subset of GTK2 through [http://sourceforge.net/projects/gtk-mui/ MUI-GTK]
# Cairo 2D Engine - [[Aros/Developer/Cairo|Usage]]/[[Aros/Developer/Cairo|Development]]
# [[Aros/Developer/Scalos|Scalos desktop API and plugin modules]]
# [[Aros/Developer/VHI|VHI video driver]]
====HIDDs====
*[[Aros/Developer/Docs/HIDD/HIDDClass|hiddclass.hidd]]
*[[Aros/Developer/Docs/HIDD/Graphics|graphics.hidd]]
*[[Aros/Developer/Docs/HIDD/VesaGfx|vesagfx.hidd]]
*[[Aros/Developer/Docs/HIDD/ATI|radeon.hidd]]
*[[Aros/Developer/Docs/HIDD/NVidia|nvidia.hidd]]
*[[Aros/Developer/Docs/HIDD/Nouveau|nouveau.hidd]]
*[[Aros/Developer/Docs/HIDD/Kbd|kbd.hidd]]
*[[Aros/Developer/Docs/HIDD/Mouse|mouse.hidd]]
*[[Aros/Developer/Docs/HIDD/i2c|i2c.hidd]]
*[[Aros/Developer/Docs/HIDD/IRQ|irq.hidd (deprecated)]]
*[[Aros/Developer/Docs/HIDD/PCI|pci.hidd]]
*[[Aros/Developer/Docs/HIDD/PCIPC|pcipc.hidd]]
*[[Aros/Developer/Docs/HIDD/Serial|serial.hidd]]
*[[Aros/Developer/Docs/HIDD/Thunderbolt|thunderbolt.hidd]]
https://github.com/aros-development-team/AROS/commit/4f02ea691799aff3a01f60cfa5f9182c82fc57a8
HIDD are used for device/peripheral low level hardware support drivers. The HIDD system is split up into a collection of classes with a strict inheritance hierarchy. A HIDD class implements a device driver for a single device or in rare cases a group of devices and provides an interface for other programs and devices to access.
In order to maintain portability of interfaces across a wide range of hardware this interface will in general not present the raw interface to the underlying hardware. Instead it will present a generic interface that describes many different hardware implementations. This allows for the best reuse of both interfaces and code.
HIDD API is heavyweight though. You need to open a HIDD library, open oop.library, instantiate an object (even if there's no object); and object calls are more costly compared to plain library calls.
Basically your task is to implement a subclass of hidd.ata.bus for your hardware. just implementing the XXXATA__Hidd_ATABus__xxxxxx methods for the Amiga chipset - and appropriate versions of the interface_xxx.c file(s). pretty much everything in probe.c could be ignored - just write a replacement scan for relevant amiga devices and store whatever info you need in the bus data? only the "SUPPORT_LEGACY" blocks might be related.
You do not need to depend on PCI API. PCI is just a way to discover the hardware on PCs, etc.
<hidd/pci.h> includes (at some depth) <interface/HW.h>, which defines IID_HW. This comes from the 'generic' HIDD class in:
rom/hidds/hidd/hiddclass.conf
did not split up HIDD and HW because they are always used in pair. It's the same as hidd/pci.h bringing definition for: PCI, PCIDriver and PCIDevice. PCI is actually PCIHW, just the name was not changed for backwards compatibility reasons. HW is a 'hub' where HIDD instances plug in.
ATA HIDD aoHidd_ATABus_Use32Bit value is completely ignored unless ata.device first detects correct command line parameter.
Yes. Unfortunately I was unable to find any comment in code or svn history with explanations. Looked at Linux source, there 32-bit PIO is also controller driver's property. Some of them enable it, some don't.
Actually, switching the default to ON should be safe. ata.device is fail-safe at this because during IDENTIFY command it validates upper 16 bits, and if they appear to be zeroes in all 128 longwords, then 32-bit mode is switched off. But, nevertheless, I know how tricky hardware can be, so I decided not to change original behavior. If you think it's wrong in some cases, then it's possible to add one more attribute like aHidd_ATABus_Default32Bit. If set to YES, then this means that 32-bit PIO is safe to use by default.
====Devices====
*[[Aros/Developer/Docs/Devices/ATA|ata.device]]
*[[Aros/Developer/Docs/Devices/Console|console.device]]
*[[Aros/Developer/Docs/Devices/Narrator|narrator.device]]
*[[Aros/Developer/Docs/Devices/Printer|printer.device]]
*[[Aros/Developer/Docs/Devices/Trackdisk|trackdisk.device]]
*[[Aros/Developer/Docs/Devices/AmberRAM|amberram.device]]
*[[Aros/Developer/Docs/Devices/Timer|timer.device]]
*[[Aros/Developer/Docs/Devices/|.device]]
The Amiga used [[Aros/Developer/Docs/Devices|Devices]] to communicate with [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=3475&viewmode=flat&order=ASC additional hardware]. AROS has replaced these hardware devices with hidd equivalents but some are still retained for backwards compatibility.
Local libraries/devices/handlers,etc. are supposed to override the ones in ROM if their version is higher than the one in ROM.
Here is the list of commands exec default:
{| class="wikitable"
| CMD_CLEAR
| Purge the buffer of the device
|----
| CMD_READ
| Playback Control
|----
| CMD_STOP
| Stopped the activity of the device
|----
| CMD_FLUSH
| Empty the queue of commands
|----
| CMD_RESET
| Reset a device
|----
| CMD_WRITE
| Playback Control
|----
| CMD_INVALID
| Create an error
|----
| CMD_UPDATE
| Gets updated device
|----
| CMD_START
| Will restart the device
|----
|}
While most other "stuff you communicate with" in AmigaOS are devices <ref>AMIGA ROM Kernel Reference Manual: Devices, 3rd Edition. Commodore-Amiga, Inc. Addison-Wesley, 1991. {{ISBN|0-201-56775-X}}</ref> that share a [http://gega.homelinux.net/AmigaDevDocs/ common base interface]. [[Aros/Developer/Docs/Devices1.3|OS 1.3 Device Drivers]].
====Handlers====
:[[Aros/Developer/Docs/Handlers/Pipe|pipe.handler]]
:[[Aros/Developer/Docs/Handlers/Port|port.handler]]
:[[Aros/Developer/Docs/Handlers/SFS|sfs.handler]]
:[[Aros/Developer/Docs/Handlers/FAT|fat.handler]]
:[[Aros/Developer/Docs/Handlers/PFS|pfs.handler]]
:[[Aros/Developer/Docs/Handlers/NTFS|fuse.handler]]
:[[Aros/Developer/Docs/Handlers/FFS|ffs.handler]]
filesystem handlers have their own separate system consisting of completely differently structured messages that dos.library use to pass requests (for things like reading, writing, getting directory contents etc.) to them. AROS originally went with implementing filesystem handlers as devices, which might arguably be more consistent with the rest of the AmigaOS API but which is quite incompatible with AmigaOS itself. However, it made it far harder to port filesystems and the gains were comparatively small, and so there's been a long standing goal of fixing this incompatibility. It has now, June 2011, been reintroduced to all AROS flavors.
are argstr and argsize valid for the handler startup environment?
DOS/RunHandler() calls DOS/CreateNewProcTags(), and then CallEntry() (in rom/dos/exit.c) to start the handler, so yes, argstr and argsize are *present* in the call signature of the handler.
Granted, argstr will be NULL and argsize 0, but those values *are* passed to the handler function using:
<pre>
AROS_UFC3(ULONG, entry,
AROS_UFCA(STRPTR, argptr, A0),
AROS_UFCA(ULONG, argsize, D0),
AROS_UFCA(struct ExecBase *, SysBase, A6));
</pre>
Creating your own [without the whole build tree http://pagesperso-orange.fr/franck.charlet/temp/radeon.zip] and then
<pre>
make stub
make
make install
</pre>
SFS has two Root blocks, one at the start and one at the end of the disk. The Root blocks both contain the same information. They hold various information about the disk structure and have the locations of some important blocks used by the filesystem.
The Root ObjectContainer contains the Root directory Object. The name of this Object is the name of the volume. It is identical to a normal directory Object.
The Bitmap is used to keep track of free space. Each bit in a bitmap represents a single block. A set bit indicates a free block and a cleared bit a used block.
AdminSpaceContainers are used to keep track of space which has been reserved for storing administration blocks. Only the Bitmap, the Root blocks and the actual data stored in files aren't stored in administration space. Administration space is allocated in chunks of 32 blocks at a time. A single AdminSpaceContainer can hold information about a large number of such areas each of which has its own little bitmap of 32 bits.
Extents are stored in a B-Tree. The Root block holds a pointer to the root of the Extent B-Tree. Extents keep track of space in use by a specific file. Each fragment a file consists of has its own Extent. Extents are in a double linked list. The list can be used to locate the next or previous fragment of a file.
Below is the standard block header. This header is found before EVERY type of block used in the filesystem, except data blocks. The id field is used to check if the block is of the correct type when it is being referred to using a BLCK pointer. The checksum field is the SUM of all LONGs in a block plus one, and then negated. When applying a checksum the checksum field itself should be set to zero. The checking a checksum the checksum is okay if the result of the checksum equals zero. The ownblock BLCK pointer points to the block itself. This field is an extra safety check to ensure we are using a valid block.
Field Type Description
id ULONG The id field is used to identify the type of block we are dealing with. It is used to make sure that when referencing a block we got a block of the correct type. The id consist of 4 bytes and each blocktype has its own unique foure letter code.
checksum ULONG This field contains the sum of all longs in this block, plus one and then negated. The checksum can be used to check if the block hasn't been corrupted in any way.
ownblock BLCK Points to itself, or in other words, this field contains the block number of this block. This is yet another way to check whether or not a block is valid.
<pre>
struct fsBlockHeader {
ULONG id;
ULONG checksum;
BLCK ownblock;
};
</pre>
The algorithm to calculate the checksum of a block:
<pre>
ULONG calcchecksum(struct fsBlockHeader *block, LONG blocksize} {
ULONG *data=(ULONG *)block;
ULONG checksum=1;
block->checksum=0;
while(blocksize>0) {
checksum+=*data++;
blocksize-=4;
}
return(-checksum);
}
</pre>
A Root block contains very important information about the structure of a SFS disk. It has information on the location and size of the disk, the blocksize used, locations of various important blocks, version information and some filesystem specific settings.
A SFS disk has two Root blocks; one located at the start of the partition and one at the end. On startup the filesystem will check both Roots to see if it is a valid SFS disk. If either one is missing SFS can still continue (although at the moment it won't).
A Root block could be missing on purpose. For example, if you extend the partition at the end (adding a few MB's) then SFS can detect this with the information stored in the Root block located at the beginning (since only the end-offset has changed). Same goes for the other way around, as long as you don't change start and end point at the same time.
When a Root block is missing because the partition has been made a bit larger, then SFS will in the future be able to resize itself without re-formatting the disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
version UWORD The version of the filesystem block structure. You can check this field to identify what version of the filesystem your dealing with it and to see if you can handle this structure correctly. Don't try to interpret the disk's structure when this field contains an unknown version number!
sequencenumber UWORD Used to identify which Root block was written last in case the sequencenumber on both Root blocks don't match.
datecreated ULONG Creation date of this volume. This is the date when the disk was last formatted and will never be changed.
bits UBYTE Various settings, see below.
<pre>
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
reserved1 ULONG[2] Reserved, leave zero.
firstbyteh ULONG High 32-bits of a 64-bit number. This is the first byte of our partition relative to the start of the disk.
firstbyte ULONG Low 32-bits of a 64-bit number.
lastbyteh ULONG High 32-bits of a 64-bit number. This is the last byte (exclusive) of our partition relative to the start of the disk.
lastbyte ULONG Low 32-bits of a 64-bit number.
totalblocks ULONG The total number of blocks this partition consists of.
blocksize ULONG The size of a block of this partition.
reserved2 ULONG[2] Reserved, leave zero.
reserved3 ULONG[8] Reserved, leave zero.
bitmapbase BLCK Block number of the start of the Bitmap.
adminspacecontainer BLCK Block number of the first AdminSpaceContainer.
rootobjectcontainer BLCK Block number of the ObjectContainer which contains the root of the disk (this is where the volume name is stored).
extentbnoderoot BLCK Block number of the root of the Extent B-Tree.
reserved4 ULONG[4] Reserved, leave zero.
</pre>
<pre>
struct fsRootBlock {
struct fsBlockHeader bheader;
UWORD version;
UWORD sequencenumber;
ULONG datecreated;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
ULONG reserved1[2];
ULONG firstbyteh;
ULONG firstbyte;
ULONG lastbyteh;
ULONG lastbyte;
BLCK totalblocks;
ULONG blocksize;
ULONG reserved2[2];
ULONG reserved3[8];
BLCK bitmapbase;
BLCK adminspacecontainer;
BLCK rootobjectcontainer;
BLCK extentbnoderoot;
ULONG reserved4[4];
};
</pre>
AdminSpaceContainers are used to store the location and bitmap of each administration space. The AdminSpaceContainers are located in a double linked list and they contain an array of fsAdminSpace structures. There is one fsAdminSpace structure for every administration space on disk.
Field Type Description
bheader struct fsBlockHeader Standard block header.
next BLCK The next AdminSpaceContainer, or zero if it is the last in the chain.
previous BLCK The previous AdminSpaceContainer, or zero if it is the first AdminSpaceContainer.
bits UBYTE The number of bits in each in the bits ULONG in the fsAdminSpace structure.
pad1 UBYTE Reserved, leave zero.
pad2 UWORD Reserved, leave zero.
adminspace struct fsAdminSpace An array of fsAdminSpace structures. The size of the array is determined by the current blocksize.
<pre>
struct fsAdminSpaceContainer {
struct fsBlockHeader bheader;
BLCK next;
BLCK previous;
UBYTE bits;
UBYTE pad1;
UWORD pad2;
struct fsAdminSpace adminspace[0];
};
</pre>
Field Type Description
space BLCK The first block of an administration space.
bits ULONG A small bitmap which is used to determine which blocks in an administration space are already in use. The number of bits in this bitmap is determined by the bits field in the AdminSpaceContainer.
<pre>
struct fsAdminSpace {
BLCK space;
ULONG bits;
};
</pre>
The fsBitmap structure is used for Bitmap blocks. A bitmap block is used to keep track of which space is in use and which isn't for a particular area of a disk. All bitmap blocks together keep track of the free space for an entire disk. The location of the first bitmap block is known and all other bitmap blocks are stored in order after the first one.
Field Type Description
bheader struct fsBlockHeader Standard block header.
bitmap ULONG An array of ULONG's. These hold the actual information on which blocks are in use and which aren't.
<pre>
struct fsBitmap {
struct fsBlockHeader bheader;
ULONG bitmap[0];
};
</pre>
Each bit in a bitmap block (except for the block header) represents a single block. If the bit is set than the block is free, and if the bit is clear then it is full. The first ULONG in the bitmap area of the first bitmap block represents blocks 0 through 31 on the disk. Bit 31 of this ULONG is block 0, 30 is block 1, and so on. Bit 0 of the first ULONG represents block 31.
Below is a table to clarify how bitmaps work even further. The first column is the bitmap block number, the second column is the number of the ULONG in the bitmap array. The third column is the bit number in this ULONG, and the last column is the block which this specific bit, in this specific bitmap block represents.
We'll assume here that a bitmap block has room for 120 ULONG's (meaning there is room for storing 32 * 120 bits).
<pre>
Bitmap block ULONG number Bit number Block represented
1 (first) 0 31 0
1 0 30 1
... ... ... ...
1 0 1 30
1 0 0 31
1 1 31 32
... ... ... ...
1 2 31 64
1 2 30 65
... ... ... ...
1 119 0 3839
2 0 31 3840
2 0 30 3841
... ... ... ...
</pre>
The last bitmap block doesn't need to be completely used. The unused bits (which belong to blocks which do not exist) all have to be clear, to indicate that these blocks are in use.
The fsObjectContainer structure is used to hold a variable number of fsObjects structures (Objects) which have the same parent directory. Each ObjectContainer must contain at least one Object. If there is space in the ObjectContainer not used by the variable number of Objects then that space is zero filled. Objects always start at 2-byte boundaries, which means sometimes a padding byte is inserted between two Objects.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the parent Object, or 0 if this object has no parent (which is only the case for the Root directory).
next BLCK The next ObjectContainer belonging to this directory, or zero if it is the last in the chain.
previous BLCK The previous ObjectContainer belonging to this directory, or zero if it is the first ObjectContainer in this directory.
object struct fsObject A variable number of fsObject structures. The number of structures depends on the individual sizes of each fsObject structure and the blocksize. These structures are located directly after each other with at most 1 byte of padding between them to get the structures aligned on a 2 byte boundary.
<pre>
struct fsObjectContainer {
struct fsBlockHeader bheader;
NODE parent;
BLCK next;
BLCK previous;
struct fsObject object[0];
};
</pre>
fsHashTable is the structure of a HashTable block. It functions much like the hash table found in FFS user directory blocks, except that it is stored in a separate block. This block contains a number of hash-chains (about 120 for a 512 byte block). Each hash-chain is a chain of Nodes. Each Node has a pointer to an Object and a pointer to the next entry in the hash-chain. Using such a hash-chain you can locate an object quickly by only knowing its name.
Field Type Description
bheader struct fsBlockHeader Standard block header.
parent NODE The node number of the directory Object this HashTable block belongs to.
hashentry NODE An array of Nodes. Each Node represents the start of a hash-chain (singly linked). A hash-value is calculated using the name of a file or directory, and this value determines in which chain the Object is linked. If there are no entries in a hash-chain then the hashentry value is zero.
<pre>
struct fsHashTable {
struct fsBlockHeader bheader;
NODE parent;
NODE hashentry[0];
};
</pre>
To calculate the hash-value using a name of an Object as input use these routines:
<pre>
UWORD calchash(UBYTE *name) {
UWORD hash=0;
/* Calculates a hash value over the passed in string.
The end of the string can be either a NUL byte or a
slash. The hash function is the same as the one
used in FastFileSystem set to international mode. */
while(name[hash]!=0 && name[hash]!='/') {
hash++;
}
while(*name!=0 && *name!='/') {
hash=hash*13+upperchar(*name++);
}
return((UWORD)(hash % (UWORD)((blocksize-sizeof(struct fsHashTable))>>2)));
}
UBYTE upperchar(UBYTE c) {
if((c>=224 && c<=254 && c!=247) || (c>='a' && c<='z')) {
c-=32;
}
return(c);
}
</pre>
The BNodeContainer is used to store B-Trees. Currently only one B-Tree is in use by this filesystem and it is used to store the location of file data. The fsBNodeContainer structure contains two other structures. The fsBlockHeader structure and the BTreeContainer structure.
Field Type Description
bheader struct fsBlockHeader Standard block header.
btc struct BTreeContainer Contains information about the B-Tree and its nodes contained in this block.
<pre>
struct fsBNodeContainer {
struct fsBlockHeader bheader;
struct BTreeContainer btc;
};
</pre>
First try and locate the Root block. It should start with "ROOT". SFS has two of these, one at the start of the partition and one at the end. One of the fields contains the block size, which will be the size of all important SFS blocks.
The root block has the root object container, which contains information about files and directories in the root directory. The object
containers basically hold one or more smaller structures that represent files and directories. Scanning them all should give you a list of
files and directories.
The root block also has the root of the Extent B-Tree. This is a standard B-Tree structure (not a binary tree) that is used commonly in
all kinds of system, you can read about how they work on Wikipedia if needed. The B-Tree holds the information about *where* all the data is
located for your files.
To recover your files, I'd do this:
* Find one of the root blocks, if not present, then figure out the block size your disk was using, and scan every block in turn to see if it
looks like an ObjectContainer (check the fsBlockHeader's ID, check if the ownblock number is equal to the block you are currently scanning,
and check its checksum). So if you currently have block 12, and you see a block with the correct id, and ownblock = 12 and its checksum is good,
then that's probably a valid ObjectContainer.
* With all the ObjectContainers found, you can extract filenames and directory names from these, but also the number of their first data
block (in the field data) and the file size. For small files (less than blocksize) this data block will be enough to recover the data.
For larger files, you might be lucky and all the remaining blocks are found after the first one (if the file was defragmented). You can't be
sure of that though so...
* For larger files, you need to find all the BNodeContainers. You could scan these in the same way you found all the ObjectContainers (look for
blocks with the correct id, ownblock number and checksum).
* With all the BNodeContainers found, you can try looking up the first data block of a file in the B-Tree structure. This is a bit complicated
-- the B-Tree consists of non-leaf nodes (blocks that only contain pointers to other B-Tree blocks), the isLeaf flag indicates this. Or it
can be a B-Tree leaf block. The leaf blocks contain extra information per entry (see https://hjohn.home.xs4all.nl/SFS/extents.htm)
<pre>
struct fsExtentBNode {
ULONG key;
ULONG next;
ULONG prev;
UWORD blocks;
};
</pre>
The key should be a block of a file (the first of a range), that is 1 to 65535 block long (depending the "blocks" field). If the file is split
up into more parts, then "next" will contain block number of the next range of blocks. You need to look this up again in the B-Tree
structure to find out how large it is.
You can for the most part ignore the other structures (bitmap, admin containers). The fsObjects and B-tree containers is what you'll need to
recover the data.
====Resources====
<pre>
rom/storage/mmakefile.src
rom/storage/storage.conf
rom/storage/storage_device.c
rom/storage/storage_ids.c
rom/storage/storage_init.c
rom/storage/storage_intern.h
rom/storage/storage_mount.c
rom/storage/storage_unit.c
</pre>
<pre>
rom/storage/includes/device.h
rom/storage/includes/unit.h
rom/storage/includes/volume.h
rom/storage/storage_intern.h
</pre>
<pre>
</pre>
*[[Aros/Developer/Docs/Resources/ACPI|acpi.resource]]
*[[Aros/Developer/Docs/Resources/Battclock|battclock.resource]]
*[[Aros/Developer/Docs/Resources/Bootloader|bootloader.resource]]
*[[Aros/Developer/Docs/Resources/Cia|cia.resource]]
*[[Aros/Developer/Docs/Resources/Filesystem|FileSystem.resource]]
*[[Aros/Developer/Docs/Resources/Hostlib|hostlib.resource]]
*[[Aros/Developer/Docs/Resources/Kernel|kernel.resource]]
*[[Aros/Developer/Docs/Resources/Misc|misc.resource]]
*[[Aros/Developer/Docs/Resources/Processor|processor.resource]]
==Debugging Code==
Please use the [http://sourceforge.net/tracker/?group_id=43586&atid=439463 AROS Bug Tracker] if any issues are found.
GRUB Command line list
<pre>
sysdebug
usbdebug - allows to see Poseidon's log in debug output
</pre>
How do I get debugging out of InitResident ? If running i386 hosted on linux sysdebug=initresident on command line.
This way you can enable any of listed flags. sysdebug=all stands for "everything"
Have an executable (crosscompiled C++ code) which has 6 MB size on disk, but after loading it in memory, 250 MB RAM is taken. Any software that would split AROS executable into ELF part which would show actual size values?
readelf -S executable
it will show you all sections in elf file, including sizes and requested alignment.
objdump -h filename
That's will give you a quick overview of the sections and sizes. Ignore all the .debug.* sections.
Would hazard a guess that you have a large .bss section. That's pretty common in C++.
Next step:
nm—size-sort filename | grep ' [bB] '
The last few will be your biggest consumers. Would suggest -C to demangle the symbols... ;)
Suggest profiling the program (just use some printf's in the main loop for time spent in each part), it usually is quite easy to spot slow parts in games or apps.
If someone has '#define IPTR ULONG' somewhere. To see where that define is, redefine IPTR in the source code that fails, just above the line that fails, and the preprocessor will tell you where it was defined first.
===How to setup gdb with AROS/hosted===
Download AROS sources (AROS-xxxxxxxx-source.tar.bz2, where xxxxxxxx is the current date) and AROS contrib sources (AROS-xxxxxxxx-contrib-source) from
Untar-bzip2 and cd to the unpacked archive directory.
> tar -xvjf AROS-xxxxxxxx-source.tar.bz2
> cd AROS-xxxxxxxx-source
Check the link to "contrib" (contrib-source) inside directory, e.g. correct like this:
> rm contrib
> ln -s ../AROS-xxxxxxxx-contrib-source.tar.bz2 contrib
Make sure you have the correct locale setting, otherwise compilation will fail at some point. See [http://aros.sourceforge.net/documentation/developers/compiling.php#setting-the-locale-to-iso8859 here] (or link below) for more on that. You might have to enter this:
> export LANG="en_US.ISO-8859-1"
Now configure for a debug build - see "./configure --help" for more - here are two examples:
> ./configure—enable-debug=stack,modules,symbols
> ./configure—enable-debug=all
You may "make" now, or choose a separate directory for your build (e.g. for easy removal), for example if compiling for i386 architecture you could create a directory like this:
> mkdir linux-i386
> cd linux-i386
> ../AROS/configure—enable-debug=stack,symbols,modules
When done configuring you're ready to go:
> make
Building AROS takes some time - minutes on fast machines (e.g. 2.5 GHz quadcore), up to hours on slower machines.
The result will be AROS Linux hosted with gdb debugging enabled.
See aros.org documentation for more on compiling AROS, including more [http://aros.sourceforge.net/documentation/developers/compiling.php --enable-debug] options.
When finished, enter bin/linux-i386/AROS directory (replace "linux-i386" with your compilation target platform, e.g. linux-x86_64, etc.) inside the unpacked archive directory. This directory contains the required .gdbinit file for properly running AROS inside gdb.
> cd bin/linux-i386/AROS
Run AROS (here: with 128MB of memory) from gdb:
> gdb—args boot/aros-unix -m 128
or
> gdb—args boot/arosboot -m 128
(gdb) r
Watch the shell output - in case AROS complains about "LoadKeyCode2RawKeyTable: Loading "DEVS:Keymaps/X11/keycode2rawkey.table" failed!" you should also see some instructions on how to create a keymap table. (see link above "more on compiling", too.)
Quit gdb, and try default keymap table:
(gdb) q
The program is running. Quit anyway (and kill it)? (y or n) y
> cd ../../..
> make default-x11keymaptable
Re-run AROS, as described above. Try e.g. RAros (= right windows key) + W to open a shell. If this doesn't work you have to create a keymap table yourself, quit gdb again, and make a new keytable:
> make change-x11keymaptable
A window will open. Watch the window's title bar, and follow the instructions.
When done, re-run AROS. RAros + W should now open a shell.
Next, compile your program with gdb support.
When you start GDB is there a warning which says
warning: File "<whatever>/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to ...
If so start gdb with "-ix .gdbinit"
<pre>
Summary - In short:
* build AROS with debugging support (i.e. ./configure --enable-debug=all)
* build your application with debugging support (i.e. option -g)
* run AROS in the GNU debugger (you may use the GUI frontend "ddd" which simplifies usage a bit)
* start your application
* use the commands "findaddr" and "add-symbol-file" as written in the debugging manual
* if the debugger doesn't find the source code of your application use the "dir" command of the debugger.
</pre>
===How to use gdb===
In AROS open a shell, then (in host shell) use CTRL-Z to go into gdb. Use "b Exec_CreatePool" (one of the functions used early on by startup code in programs) to add a breakpoint, then "cont" and gdb will interrupt somewhere early during startup of "program". Use "bt" to show backtrace and "loadseg" for "??" entries. One of them will be for "program". After that you can use "disassemble program".
One thing you need to make sure is that .gdbinit you have in your build directory is the same as in source tree. It has been modified some time ago, but the build system does not refresh it - you need to copy it manually
To recap, please read our debugging [http://aros.sourceforge.net/documentation/developers/debugging.php manual]:
To detect segfaulting when loading, try...
./configure—enable-debug—with-optimization="-O2"
Because crash or no crash may depend on optimization. For newer compilers maybe this helps...
--with-optimization=-"-O2 -fno-strict-aliasing"
One way to make crashes less random (more easily reproducible) is to activate the munging of free memory in rom/exec/freemem.c which is normally commented out:
<pre>
Index: freemem.c
===================================================================
--- freemem.c (revision 34289)
+++ freemem.c (working copy)
@@ -154,11 +154,12 @@
* created with their TCB placed in the tc_MemEntry list. The workaround
* is to avoid munging when FreeMem() is called with task switching disabled.
*/
+
/* DOH! it doesn't work even this way. What's wrong???
- *
- * if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
- * MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
*/
+
+ if ((SysBase->TDNestCnt < 0) && (SysBase->IDNestCnt < 0))
+ MUNGE_BLOCK(memoryBlock, MEMFILL_FREE, byteSize);
}
</pre>
Mungwall can be turned on at runtime. Currently this works in all hosted versions. Just specify "mungwall" on kernel command line and it works. It can work on native too. In order to enable it you need to parse kernel command line, and if "mungwall" is present, set EXECF_MungWall bit in IntExecBase.IntFlags.
This needs to be done before the first AllocMem() for obvious reasons. And never reset back this flag! If you change it on a working system, you are doomed.
Hosted ports do the processing in rom/exec/prepareexecbase.c --enable-debug=mungwall option in configure still works but is going obsolete. A kludge in rom/exec/allocmem.c is responsible for this and it needs to be removed when the transition is done.
BTW, on i386-pc port it can be activated by "mungwall" argument on command line, you don't need to rebuild AROS.
New mungwall affects not only AllocMem()/FreeMem(), but also pools. I also tested it with AllocAbs(), seems to work correctly.
Runtime mungwall works on:
* pc-i386
* pc-x86_64
* linux-i386
* linux-x86_64
* darwin-x86
* linux-ppc
Works on all hosted ports, if the port itself is working.
* amiga-m68k
* Not on sam440-ppc and efika-chrp-ppc, even if they would be able to be built at moment. Does not work on (for now, need NVRAM support)
When starting my freshly rebuilt i386-linux-aros which was compiled with full debugging support I get sometimes the error "Program exited with code 0377". Add the following to your .gdbinit:
set follow-fork-mode child
Here are some of the custom AROS gdb functions (defined in ".gdbinit" file) to resolve "in ?? ()" entries in backtrace:
<pre>
#0 0xb7ffd424 in __kernel_vsyscall ()
#1 0xb7e2a657 in sigsuspend () from /lib/libc.so.6
#2 0xb7c63900 in ?? ()
#3 0xb7c640e3 in ?? ()
#4 0xb7c641e0 in ?? ()
</pre>
You can use
loadseg 0xb7c63900
loadframe 2
or
loadbt
and some others. Use "help " for a little help text. If the commands do not work try "loadkick" first.
Use "thistask", "taskready", "taskwait" to get list of AROS tasks. "bttask " shows backtrace of a task which is in ready or in wait queue and "loadseg" to resolve "??" entries in it's backtrace ("loadframe" would not work as it assume current running task).
===Native debugging tools for AROS===
to enable debugging at boot time entering the GRUB menu editing line (E key) and adding "debug=memory" to your boot line, then press Ctrl+X to complete booting.
SYS:Tools/Debug/'''Bifteck'''
Open a shell and enter the line below to run Biftek and grab the debug messages collected in RAM into a text file.
tools/debug/bifteck > ram:debug.txt
and certainly does not open a window. It is a shell tool and only dumps data located from the debug location.
It is therefore important to 'catch' that debug data as soon as possible (before it gets overridden). You should invoke bifteck at the first opportunity before doing anything else. You can use the TO option to store bifteck output to a file or you can pipe it manually to a file.
SYS:Tools/Debug/'''Sashimi''' - displays error messages
One suggestion is to do a bug() debugging. Each time bug() is executed it will be output on sashimi.
You include <aros/debug.h> and place bug("something\n"); in your source code at location though which control passes.
To get the output - open an aros shell
SYS:Tools/Debug/sashimi > RAM:out.txt
'''Ctrl C''' to end the output to the RAM Disk.
# open shell, and type
# ram: (to switch to ram drive)
# System:Tools/Debug/Sashimi > mylogfile.txt
# open AHI prefs using wanderer (or use another opened shell)
# play test sound
# close AHI prefs
# shell still open with Sashimi running: press ctrl-c to break Sashimi and return to prompt.
# in shell: copy mylogfile.txt System: (or to your required location)
SYS:Utilities/'''Snoopy''' - monitors OS function calls, run "Sashimi" to see Snoopy's output
SYS:Tools/'''WiMP''' - the Window (and Screens) Manipulation Program
You can use the -E option of gcc to find out how preprocessor macros are expanded.
===Errors===
crash in strcasecmp usually means that one of its arguments is NULL.
empty space between these two names, prossibly some invisible character
Old Amiga [http://www.amigacoding.com/index.php?title=Guru_codes&redirect=no Guru Codes]
If the crash is in intuition. Sometimes, if it relates to text, a null pointer sets it off.
an uninitialised pointer can have any address (this is a common fault).
Compiling on 64bit, Many old code would not properly typecast when doing pointer-integer conversions and thus at least throw a warning. This can easily be located and fixed.
[http://www.aros.org/cs/documentation/developers/app-dev/portable.php Portable code]
* Use texteditor or some tool to replace all "ULONG" with "IPTR" and "LONG" with "SIPTR" in the sources.
* Fix (change IPTR/SIPTR back to ULONG/LONG) the few places which really rely on ULONG/LONG being exactly 32 bit. That's for things like pixel (ARGB) buffers, structs written/read to disk, colormaps, but probably not much else.
Then again, many current compilers also throw a warning when you try to assign a pointer value to an integer and the integer is possibly too small. This happens under .NET for example when a 64 bit pointer is assigned to something like an ULONG - so exactly the case which you described.
=== Example ===
<syntaxhighlight lang="c">
/* 1. Header for your name,date,purpose of program.
2. Pre-processor directives. This will include the #includes for files you want to add.
3. Includes for function prototypes if necessary.
4. Main()
Create Pointers for Libraries and any Window you want to open.
5. Open necessary libraries.
6. Check if open exit program if fail.
7. Open a window exit program if fail.
8. Add your program
9. Close Window
10 Close Libraries.
11 End Program. */
/* standard os included headers <.h> */
#include <dos/dos.h>
#include <dos/dosasl.h>
#include <dos/dosextens.h>
#include <dos/exall.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <utility/utility.h>
#include <intuition/intuition.h>
/* define as unresolved external references (proto/xxx.h) and compiler will link to auto(matically) open library */
#include <proto/arossupport.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <datatypes/pictureclass.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include proto/bsdsocket.h
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* my own headers ".h" */
#define CTRL_C (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
#define isDir(fib) ((fib)->fib_DirEntryType >= 0)
#define ARG_TEMPLATE "FILE/A,ALL/S,QUIET/S,W=WIDTH/N,H=HEIGHT/N,M=METHOD,DEFTOOL"
int main(void)
{
return retval;
} /* main */
</syntaxhighlight>
If you used c++, there is not yet c++ support in our shared library system.
The easiest way to create / compile a shared library would be to use the AROS build system but the libraries can be created manually. You have to create a ROMTAG structure and some header files.
A shared library is built with the %build_module macro with a line like this:
%build_module mmake=MetaTarget modname=mylib modtype=library files=SourceFiles
This macro can build different AROS module types, like devices, Zune classes, HIDDs, etc.
<pre>
##begin config
version 1.0
##end config
##begin functionlist
void func1(LONG a, LONG b)
int func2(char *s, ULONG a)
##end functionlist
</pre>
Alternatively,
<pre>
#ifndef LIB_H
#define LIB_H
#define __NOLIBBASE__
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#ifdef __AROS__
//#include <aros/debug.h>
#define reg(x)
#define __saveds
#endif
#define USESYSBASE struct ExecBase *SysBase = Base->My_SysBase;
struct MyTestBase
{
struct Library My_Test_Lib;
struct ExecBase *My_SysBase;
APTR My_SegList;
int testint;
};
#endif
</pre>
<pre>
/*--------------------------------------------------------------------------*/
/* Resident header written for mytest.library */
/*--------------------------------------------------------------------------*/
#define __NOLIBBASE__
#define VERSION 1
#define REVISION 0
#define LIBHEADNAME mytest
#define LIBHEADNAMESTR "mytest"
#define COMPDATE "04.10.2015"
#define VERS "1.0"
#define LIBBASETYPE struct MyTestBase
#define LIBBASETYPEPTR LIBBASETYPE *
#include <aros/debug.h>
#include <exec/exec.h>
#include <proto/exec.h>
#include <exec/resident.h>
#include <exec/nodes.h>
#include <exec/libraries.h>
#include <aros/symbolsets.h>
#include "lib.h"
const UBYTE lib_name[] = LIBHEADNAMESTR ".library";
const UBYTE lib_id[] = "$VER: " LIBHEADNAMESTR ".library " VERS " (" COMPDATE ") by ALB42\n";
extern const APTR FuncTable[];
AROS_UFP3 (LIBBASETYPEPTR, InitLib,
AROS_UFPA(LIBBASETYPEPTR, Base, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, sysbase, A6)
);
static struct LibInitStruct
{
IPTR LibSize;
const APTR *FuncTable;
const struct DataTable *DataTable;
APTR InitFunc;
}
const LibInitStruct =
{
sizeof(LIBBASETYPE),
FuncTable,
NULL,
(APTR)InitLib
};
const struct Resident romtag =
{
RTC_MATCHWORD, /* match word */
(APTR)&romtag, /* back pointer */
(APTR)(&romtag + 1), /* skip pointer */
RTF_AUTOINIT | RTF_EXTENDED,/* flags */
VERSION, /* version */
NT_LIBRARY, /* type of module */
0, /* init priority */
(STRPTR)lib_name, /* module name */
(STRPTR)lib_id + 6,
(APTR)&LibInitStruct,
REVISION, NULL
};
AROS_UFH3 (LIBBASETYPEPTR, InitLib,
AROS_UFHA(LIBBASETYPEPTR, Base, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, sysbase, A6)
)
{
AROS_USERFUNC_INIT
Base->My_SegList = seglist;
Base->My_SysBase = (APTR)sysbase;
Base->testint = 0;
USESYSBASE
bug("InitLib\n");
if (!set_open_libraries())
{
set_close_libraries();
return NULL;
}
return Base;
AROS_USERFUNC_EXIT
}
AROS_LH1(LIBBASETYPEPTR, LibOpen,
AROS_LHA (ULONG, version, D0),
LIBBASETYPEPTR, Base, 1, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibOpen\n");
(void)version;
Base->My_Test_Lib.lib_OpenCnt++;
return Base;
AROS_LIBFUNC_EXIT
}
__saveds APTR LibExpungeInternal(LIBBASETYPE *Base reg(a6))
{
USESYSBASE
APTR seglist;
bug("LibExpungeInternal\n");
if (Base->My_Test_Lib.lib_OpenCnt)
{
return 0;
}
seglist = Base->My_SegList;
Forbid();
Remove((struct Node*)Base);
Permit();
FreeMem((APTR)Base - Base->My_Test_Lib.lib_NegSize, (LONG)Base->My_Test_Lib.lib_PosSize +
(LONG)Base->My_Test_Lib.lib_NegSize);
set_close_libraries();
return seglist;
}
AROS_LH0(BPTR, LibClose,
LIBBASETYPEPTR, Base, 2, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibClose\n");
if (!(--Base->My_Test_Lib.lib_OpenCnt))
{
return LibExpungeInternal(Base);
}
return 0;
AROS_LIBFUNC_EXIT
}
AROS_LH1(BPTR, LibExpunge,
AROS_LHA(LIBBASETYPEPTR, Base, D0),
struct ExecBase *, sysBase, 3, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
(void)sysBase;
USESYSBASE
bug("LibExpunge\n");
return LibExpungeInternal(Base);
AROS_LIBFUNC_EXIT
}
AROS_LH0(LIBBASETYPEPTR, LibReserved,
LIBBASETYPEPTR, Base, 4, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("LibReserved\n");
return 0;
//return (APTR)LibReserved();
AROS_LIBFUNC_EXIT
}
// Space for your own functions
// do not forget to update the FuncTable as well
AROS_LH1(int, TestFunction,
AROS_LHA(int, TestValue, D0),
LIBBASETYPEPTR, Base, 5, LIBHEADNAME
)
{
AROS_LIBFUNC_INIT
USESYSBASE
bug("TestFunction\n");
Base->testint = TestValue + Base->testint;
return Base->testint;
AROS_LIBFUNC_EXIT
}
// Functable -> Table of all functions in the Library, in right order - important!
const APTR FuncTable[] =
{
&AROS_SLIB_ENTRY(LibOpen,LIBHEADNAME,1),
&AROS_SLIB_ENTRY(LibClose,LIBHEADNAME,2),
&AROS_SLIB_ENTRY(LibExpunge,LIBHEADNAME,3),
&AROS_SLIB_ENTRY(LibReserved,LIBHEADNAME,4),
&AROS_SLIB_ENTRY(TestFunction,LIBHEADNAME,5),
(void *)-1
};
// AutoInit stuff
void *__PROGRAM_ENTRIES__symbol_set_handler_missing;
void *__LIBS__symbol_set_handler_missing;
// end of AutoInitStuff
</pre>
Makefile
<pre>
VPATH =
CFLAGS = -O2 -g -fomit-frame-pointer -W -Wall -Wno-parentheses
CC = i386-aros-gcc
LD = i386-aros-gcc
LDFLAGS = -nostartfiles -Wl,-Map -Xlinker linkermap
LIBS = -lautoinit -llibinit
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
OBJS = lib_header.o
all: mytest.library
mytest.library: $(OBJS)
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
lib_header.o: lib_header.c lib.h
clean:
rm -f *.o *.library *.ppu testlibrary linkermap
</pre>
Porting UNIX library to AROS - dealing with static variables which would make it easy to port such libraries to AROS, keeping the benefits of sharing them on disk, but losing the benefit of actually sharing them in memory.
Our problem arises by the fact we want to share the actual code (the .text section of the library) and constant data, but we need to have per-task .bss and .data sections. If we get rid of our intention to share the .text and .rodata sections, things get quite easy: just load and relocate the library whenever it's open, by whoever it's open. It's like statically linking the library into the executable, except that the final linking is done at runtime.
In the V0 branch, in workbench/hidds/hidd.nouveau was committed pcimock.hidd. This is a pci driver that allows mocking real PCI devices under linux-hosted. The main idea is to be able to run the real hardware driver under linux-hosted with as little changes as possible (some changes will always be needed though unless someone wants to write complete device simulator) so that driver's code paths can be executed and debugged using gdb. This was a very helpful capability when porting nouveau. Now it is externalized from nouveau.hidd and can be used by other people porting drivers. The pcimock.hidd can currently mock 4 different nvidia cards, 1 AGP bridge and also mock irq.hidd.
What's the difference between this driver and the pcilinux.hidd? I used that one to develop many different HW drivers for aros. As far as I understood the intention of pcilinux.hidd it is supposed to get access to real hardware that is running under linux. The pcimock.hidd goal is to mock the hardware. For example my dev box is a PCIE system, but I still would like to run the AGP codes paths in nouveau under linux-hosted to check if they don't seg fault. The other case would be to run codes paths for hardware that the developer does not have (Fermi cards in my case). In the case of pcimock.hidd, the AROS driver's code paths will execute as long as you add proper mocking (for example fill in PCI config area or values for registers in BARs). This is an advantage for ported drivers - the code should already work (since it worked on another system) but there might have been mistakes made during porting which can be detected easily with gdb.
In case you are writing your driver from scratch, pcilinux.hidd hidd will give you more advantage, since you can actually access the real hardware from linux-hosted.
== Misc ==
===APL, MPL, BSD, GPL and LGPL Licences===
The majority of AROS sources in licensed under AROS Public License ([http://aros.sourceforge.net/license.html APL]) which (to a degree) protects us from someone taking AROS sources and not contributing improvements back (for example MorphOS took some AROS source and then contributed changes back)
It is written to allow the use of AROS code in other open source or commercial projects without exception whilst providing a mechanism so that improvements/additions can find their way back to the original source in one form or another.
There are "3rd" party applications used by AROS that do not fall under this license, which are an extra "Contrib" download for convenience.
Anyone can port GPL-ed network and sound drivers as AROSTCP and AHI are GPLed. Direct using (porting) [http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs GPL]-ed code in other parts of AROS (gfx, sata, usb) is not possible because AROS license is not compatible with GPL. You need to utilize permissive licensed code like BSD or MIT/X11.
BSD and MPL license are the closest to APL.
APL however is not so compatible with LGPL/GPL.
LGPL case - you cannot statically combine APL code with LGPL. You can, however thank to LGPL being "lesser" restrictive, use LGPL dynamically loaded libraries in APL codes.
GPL case - you cannot combine APL code with GPL in any way if there is no explicit clause by GPLed code authors allowing that. If you do combine APL with GPL in "bad" ways described above - you have a problem (you violate GPL). This problem might result in everything in AROS becoming GPL or everything running or AROS becoming GPL (here I'm not sure really). The other scenario is that you are not allowed to legally distribute such code at all. To be honest I have grasped how to violate GPL, but I'm still no exactly sure what happens when you violate it (but I'm sure it's not anything nice)
GPL software can run on top of non-GPL "system components" (see system components exception of GPL), but the other way around (non-GPL using GPL) leads to problems. This means applications like scout, or Quake III are ok (in the majority of cases).
Theres no reason GPL drivers cannot be ported - but they cant be in AROS's ROM (requires linking APL code with GPL), nor can AROS depend on them (e.g. they must use existing apis).
If they are launched (dynamically linked) by a user action that is allowed. It is also allowed to distribute such binaries together for convenience.
GPL is not about statical or dynamic linking but is about executing process and function calls.
These components - SFS, isapnp, Zune texteditor, AHi, network drivers, freetype, openuirl, BHFormat, Edit and (" dynamically loaded libraries") are LGPL, not GPL. Mesa/Nouveau stuff is MIT. Some user tools are GPL though.
'''AROS (system)'''
* system components (libraries/classes/devices/etc) cannot be GPL as they would propagate GPL to complete system as well as GPL is not compatible with MPL from which APL is based
* system components can be LGPL v2 or a permissive license (MIT/BSD)
* system applications can be anything you like (but still I would prefer APL or permissive so the code can be reused if needed)
'''Contrib:'''
* no rules - contrib does not impact AROS system since nothing in AROS system depends on contrib.
About stealing code: The chances of this happening is exactly the same whether we are APL or GPL. If any closed-source option wanted to do it, there is no one that can validate otherwise. MorphOS has used some AROS codes, but contributed changes back.
The rationale behind APL is that while it guarantees that the original developer will get the improvements back (to a certain degree - file based), the person who uses the codes does not have to open his original codes. BSD does not guarantee that the original developer gets improvements. GPL requires the person using the codes to open his codes as well.
The copyright holders needs to stay - we just need information from them that the codes are available under APL (for example a checked-in file like in case of Poseidon). We don't do transfer of copyrights.
; Ultimately what can and cannot be done is up to the author(s) - not the licence.
===AROS source code tree===
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-trunk.txt
* http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
Found this interesting (non-GPL) licensing 'anomaly' - to keep in mind for distributors.
Programs that lose their license if sold ("non-profit only" licensed):
contrib/aminet/comm/term/TinyTerminal
contrib/aminet/dev/basic/bwBASIC
contrib/aminet/text/edit/xdme
contrib/fish/aroach
contrib/fish/lotto
contrib/fish/shuffle
contrib/fish/touch
+ cdvdfs.
Here is a list of all the GPL/GPLv2/GPLv3 licenses fossology found, what have explicit licenses in their comments.
excluded LGPL, BSD/GPL dual licensed and programs (such as Prefs/Edit and BHFormat)
<pre>
AROS/rom/dbus/include/ AFL_v2.1 ,GPL_v2+ (supposedly AFL < 3 is GPL incompatible)
AROS/workbench/classes/zune/betterstring/include/ GPL_v2+
AROS/workbench/classes/zune/texteditor/include/ GPL_v2+
AROS/workbench/classes/datatypes/gemimage/ GPL_v2+ GPL
AROS/workbench/classes/datatypes/degas/ GPL_v2+
AROS/workbench/libs/openurl/README: GPL
AROS/workbench/network/smbfs/documentation/ GPL_v2
AROS/workbench/network/smbfs/source_code/ GPL_v2+
AROS/workbench/network/stacks/AROSTCP/bsdsocket/kern/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/mmakefile.src conf.h GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/sys/ CMU ,GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/net/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/api/ GPL_v2
AROS/workbench/network/stacks/AROSTCP/bsdsocket/conf/conf.h: GPL_v2
AROS/workbench/network/stacks/AROSTCP/netinclude/net/radix.h: CMU ,GPL_v2
AROS/workbench/devs/AHI/AHI/ GPL_v2+
AROS/workbench/devs/AHI/AddAudioModes/ GPL_v2+ AROS/workbench/devs/AHI/AddAudioModes/COPYING: GPL
AROS/workbench/devs/AHI/Docs/texinfo.tex: GPL_v2+
AROS/workbench/devs/AHI/COPYING: GPL
AROS/workbench/devs/AHI/Drivers/EMU10kx/ GPL_v2+
AROS/workbench/devs/AHI/AHI-Handler/ GPL_v2+
AROS/workbench/devs/networks/rtl8029/ GPL GPL_v2+
AROS/workbench/devs/networks/pcnet32/ GPL GPL_v2+
AROS/workbench/devs/networks/ppp/LEGAL: GPL
AROS/workbench/devs/networks/atheros5000/ GPL_v2+
AROS/workbench/devs/networks/rhine/ GPL_v2+
AROS/workbench/devs/networks/nForce/ GPL_v2+ GPL
AROS/workbench/devs/networks/prism2/ GPL GPL_v2+
AROS/workbench/devs/networks/fec/LEGAL: GPL
AROS/workbench/devs/networks/rtl8139/ GPL GPL_v2+
AROS/workbench/devs/networks/etherlink3/ GPL GPL_v2+
AROS/workbench/devs/networks/intelpro100/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8169/ GPL GPL_v2+
AROS/workbench/devs/networks/emac/ GPL GPL_v2+
AROS/workbench/devs/networks/rtl8168/ GPL GPL_v2+
AROS/workbench/devs/networks/realtek8180/ GPL_v2+
AROS/workbench/devs/networks/via-rhine/via-rhine.c: GPL_v2+
AROS/workbench/devs/networks/via-rhine/ GPL GPL_v2+
AROS/workbench/devs/networks/e1000/ GPL_v2
AROS/workbench/devs/networks/sis900/ GPL GPL_v2+
</pre>
AHI: it has special provisions (COPYING.DRIVERS). The library is LGPL, preferences software is GPL and drivers can be anything without breaking GPL/LGPL.
Network stack: well, we are long overdue for a new, IPv6 enabled network stack anyway, anyone interested? ;) Seriously though it seems like the glue code is GPL and as all the drivers. However some of the drivers are our own code, so they could be relicensed to LGPL.
Same filter as the AROS trunk list. These should all be libraries or plugins - no programs.
<pre>
contrib/regina/utsname.h: GPL_v2+
contrib/mui/classes/nlist/include/default-align.h: GPL_v2+
contrib/mui/classes/nlist/include/amiga-align.h: GPL_v2+
contrib/mui/classes/BWins/include/MUI/BWin_mcc.h: GPL
contrib/mui/classes/BWins/include/BWin_private_mcc.h: GPL
contrib/mui/classes/BWins/COPYING: GPL_v2
contrib/mui/classes/BWins/MCC_BWins.readme: GPL_v2
contrib/mui/classes/thebar/include/default-align.h: GPL_v2+
contrib/mui/classes/thebar/include/amiga-align.h: GPL_v2+
contrib/gfx/libs/wazp3d/LEGAL: GPL
contrib/gfx/libs/wazp3d/Wazp3D.readme: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/soft3d_opengl.c: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.h: GPL
contrib/gfx/libs/wazp3d/Wazp3D-src/Wazp3D.c: GPL
contrib/libs/mpega/ GPL_v2+
</pre>
http://www.evillabs.net/AROS/Audit-2012-03-14/AROS-contrib.txt
===Types===
On AROS following rules apply:
<pre>
1. BYTE/UBYTE is 8bit, WORD/UWORD is 16bit, LONG/ULONG is 32bit, QUAD/UQUAD is 64bit, the types are comparable with stdint types (int8_t, int16_t, int32_t, int64_t)
2. IPTR/SIPTR are integer types large enough to fit pointer, that is sizeof(IPTR) = sizeof(APTR) = 4 on 32bit system, and = 8 on 64bit system
3. ti_Data in TagList is large enough to hold a IPTR/APTR type.
4. never store a pointer in integer of type LONG. It may work (if the pointer has upper 32bits clear), but does not have to. Compiler should warn you about that.
5. If you are unsure about point 4, allocate your memory with MEMF_31BIT flag set. But don't expect that AROS internals will do the same.
</pre>
point 4 is actually important.
* UBYTE/BYTE for 8bit
* UWORD/WORD for 16bit
* ULONG/LONG for 32bit
* UQUAD/QUAD for 64bit
<pre>
UBYTE Unsigned 8 bit integer variable (byte).
BYTE Signed 8 bit integer variable (byte).
UWORD Unsigned 16 bit integer variable (word).
WORD Signed 16 bit integer variable (word).
ULONG Unsigned 32 bit integer variable (longword).
LONG Signed 32 bit integer variable (longword).
FLOAT 32 bit IEEE floating point variable.
UQUAD Unsigned 64 bit integer variable.
QUAD Signed 64 bit integer variable.
DOUBLE 64bit IEEE floating point variable.
BOOL Boolean variable, TRUE and FALSE are also defined in exec/types.h.
VOID Void.
APTR A generic pointer for multiple purposes - Arrays.
STRPTR A pointer to a null-terminated string.
IPTR Really important in AROS, the only way to declare a field that can contain both: an integer or a pointer.
</pre>
if you want to write really portable app, you may be interested in standard datatypes defined in C99: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, intptr_t, uintptr_t. They are all defined in inttypes.h include file.
In exec/types.h the following short-cuts are typedef'd. They are used often in AROS, so you should nearly always include exec/types.h and soon only they will be removed from sys/_types.h include, all types are now defined in include files named aros/types/xxx.h.
(Preparation for C library split; sys/xxx.h include will only be available there when compiling with POSIX C library)
Compiler specific types, like int and long might change their size. In case of AROS, similar to linux, int remains 32 bit whereas long grows to 64 bits in size.
If you use Amiga-like data types, i.e. BYTE/UBYTE, WORD/UWORD, LONG/ULONG and QUAD/UQUAD or the C99 standard types (uint8_t and so on, see stdint.h include) then you should have less issues to solve than by using types without size guarantee.
Of course, all pointers grow to 64 bytes using 64bit cpu. Most of the code can be just recompiled and will work. In rare cases, where e.g. pointers are casted to integers, a special care must be taken. Especially in the cases, where pointer is casted to LONG/ULONG (this code will break on 64 bit AROS) e.g. '#define IPTR ULONG'.
With compiler delint patches which the majority of them are simple casting issues to make the compiler happy. Notice some of the changes involve introducing double casts. In very recent versions of GCC. Yes, the bulk of the double casts are for converting 32 bit addresses (ie from a 32 bit PCI DMA address register) to a 64 bit pointer. First cast is to IPTR (to expand to 64 bits, and prevent sign extension if the address is above 0x7FFFFFFF), and then to APTR.
ULONG != IPTR except on 32bit .. so if you need to store pointers make sure and use IPTR and not ULONG (which some old code does). For this reason things like Taglist elements are 64bit (since the tag data can be a pointer).
If your passing items on the stack you should use the STACKED attribute to make sure they are correctly aligned (on 64bit all items on the stack are 64bit..)
There is more issues like using "== 0L" causes problems.
===Endian===
*BE
*LE
Use the macros from <endian.h> instead making a guess based upon architecture defines
<pre>
#if _BYTE_ORDER == _BIG_ENDIAN
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#else
+
#error <whatever.h> - Byte order for this architecture is unsupported!
</pre>
===SVN and GIT===
If you want to help develop AROS OS itself, you can
* view current GIT/SVN entries [http://aros.sourceforge.net/ Aros Org website] or [https://github.com/aros-development-team/AROS Github], [https://github.com/ezrec older ezrec mirror], [https://github.com/michalsc/AROS/ older mirror], [https://trac.aros.org/trac/timeline TRAC], [],
* awaiting update [http://repo.or.cz/w/AROS.git git repo], [http://www.ohloh.net/p/aros/commits ohloh] or [https://svn.aros.org/svn/aros/trunk/ svn repo] and access [Git version git://repo.or.cz/AROS.git here],
* deprecated [https://www.gitorious.org/aros/aros/commit/a7fda9e ARIX commits] or [https://gitorious.org/aros/aros GIT old]
If you have SVN access (early 2015 introduced a new SVN server, create a new account at trac aros org) and/or have obtained the source [http://aros.sourceforge.net/download.php AROS site] - you can compile the current build tools/environment using:
> make development
and follow this [http://aros.sourceforge.net/documentation/developers/compiling.php#building procedure] or [https://github.com/apiraino/aros_guide Guide]
https://trac.aros.org/trac#Developing
If you plan on contributing back changes, please post information about such changes first on this [http://mail.aros.org/mailman/listinfo/aros-dev/ mailing list] for more experience developers can validate whether they are correct.
Then there are the nightly build machines. They svn update before the build and run configure as one of the next steps. autoconf might be added to the nightly build scripts.
Our build relies on packages downloaded from Internet (SDL for example) - it always worked this way. The minimal requirement (when just building core AROS) is binutils and gcc. If you build contrib as well, you need many more packages to be downloaded.
https://gitorious.org/aros/aros/commits/crosstools-II
git://gitorious.org/aros/aros.git
Branch crosstools-II there is only one commit on top of ABI_V1
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-x86_64
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-x86_64
</pre>
and
<pre>
../../aros-src/AROS/configure --enable-ccache
--with-portssources=~/aros/Sources --target=pc-i386
--with-aros-toolchain-install=/home/weissms/media/data/aros/test/crosstools/pc-i386
</pre>
build OK.
:''More information: [[Aros/Developer/Maintainer|AROS Maintainer Docs]]''
===SDI Calls===
Integrate the 'SDI'-headers to allow easier porting to all amiga-like platforms.
<pre>
PUTCHARPROTO( PutTheChar, char c, struct SPrintfStream *s )
{
// REAL CODE
}
</pre>
have "SDI_compiler.h" and "SDI_hook.h" included
its more organized like
#include SDI/SDI_hook.h
than
#include SDI_hook.h
option 1 --- i also use when back porting from amiga's..
<pre>
#ifdef __AROS__
#include SDI/SDI_hook.h
#else
#include SDI_hook.h
#endif
</pre>
also
you can add the -i include/sdi/ location if you do not want to add or edit any files.
Defining HOOKPROTO to IPTR name(struct IClass * cl, Object * obj, Msg msg); solved the problem
A MUI application most likely needs only the HOOKPROTOxxx SDI macros. They are compatible with AROS, only the attributes (hook, object attribute) must be given in the right order. examine compiler/include/aros/symbolsets.h (AROS_LIBREQ)
compiling mui stuff for aros setting -std=gnu99 is necessary (i have had -std=c99 most of the time).
===Locale with Flexcat===
Most languages have a locale, but not every app is localized, the only thing needed is to translate the "catalog" files. It is a case of locating the correct catalog and saving the translated version.
For every app that lacks of your language catalog and is localized anyway, you should find (in the sources) files related to locale:
* file.cd = catalog descriptor, contains base msg, with internal language (usually english)
* language.ct = catalog translation, contains every translated msg, indexed as in the file.cd.
Compare with other localized apps... Then, "make my_app-catalogs" should create and install your translated catalogs. ex : for, saying, sys:prefs/wanderer:
on root of AROS sources, type:
"make workbench-prefs-wanderer-catalogs"
then (if you changed the .cd file):
"make workbench-prefs-wanderer"
For apps not localized, you have to adapt their code to support it, if it is possible...
noticed the original .cd file has many (//) strings at the end of any voice, so added them also to the .ct file.
That (//) is only for cd files. I'm highly recommending to use FlexCat for updating ct files, e.g. like this:
flexcat app.cd deutsch.ct newctfile deutsch.ct
You'll get error checking and new entries are marked in the resulting ct file.
When editing .ct files, only change those lines containing translation and perhaps version string, nothing else.
The rest is up to the relevant tool, flexcat. In order to update your translation, type in the following in your shell:
flexcat xyz.cd xyz.ct NEWCTFILE xyz_upd.ct COPYMSGNEW
This way you will not only make sure you have correct translation file but flexcat also pre-fills newly added strings with "*** NEW *** text. Even better tool for checking cd/ct/catalog files is catcheck, but this one is sadly only available for AmigaOS/68k...
Some languages have variations, like portugues from portugal and portugues from brasil differs...
This is the way to go. I will have a look at language files, but basically if those two languages differ you have to do two separated set of translation files, yes.
(you could create a brazilian slang language localization too)
* At system level localization for one language is a dot language file.
(ex: locale:languages/klingon.language)
* At app level localization is a dot catalog file
(ex: locale:catalogs/klingon/system/libs/dos.catalog)
* At sources level, the dot ct file, and "$language" dot cd files and some building framework.
(ex: catalogs/my_app.ct catalogs/klingon.cd catalogs/mmakefile.src support.c support.h)
Please, use Flexcat to generate CT files:
FlexCat wanderer.cd NEWCTFILE=deutsch.ct
Then fill the first 2 lines with something useful:
<pre>
## version $VER: wanderer.catalog 1.1 (9.2.2006)
## language deutsch
</pre>
You can even update the CT-File: (This adds the new strings)
FlexCat wanderer.cd deutsch.ct NEWCTFILE=deutsch.ct
To compile a catalog you only need the .cd file and your translation (.ct file):
FlexCat multiview.cd deutsch.ct CATALOG=MultiView.catalog
[http://murks-ide.svn.sourceforge.net/viewvc/murks-ide/trunk/src/Catalogs/flexcat_linux?revision=100 Linux version of FlexCat]
: [http://aros.sourceforge.net/documentation/developers/app-dev/localization.php#localization-for-non-developers More information]
A script which compares the required version (i.e. the version which an application/module etc. tries to open) with the version of the existing CT files. The result is in this table:
https://github.com/aros-translation-team/translations/wiki/Progress
The following cases are highlighted:
n/a i.e. CT misses at all
version in existing CT file is lower than the required version
It might be a bit difficult to participate if you haven't worked with Git before but alternatively you can send your CT files to our Slack channel.
When the ct file has been generated via flexcat (flexcat keyshow.cd NEWCTFILE=spanish.ct) it has the following header:
---------------------------------------------------------------------------------------------------------------
## version $VER: <name>.catalog <ver>.<rev> (04.01.2021)
## language nolanguage
## codeset 0
;
---------------------------------------------------------------------------------------------------------------
Those values <ver>.<rev> are the version and revision of the CT file for the languaje or are the values of the application being localized?
The <ver> part must match with version which the application tries to open. You can find the value either in the column "Required Version" in the table which I've linked above, our you can look in the git repository. For keyshow it would be https://github.com/aros-translation-team/keyshow. You can find in the file "catalog_version.h" the right version number.
The <rev> part starts for new CT files with 0 and should be increased every time the CT file is updated.
Updated several files and created a few more that were missing on the spanish catalog.
The catalogs are in Git repositories at https://github.com/aros-translation-team
a) You tell me your Github user name. I'll invite you. You can work directly with the Git repositories.
b) You create Github forks of the catalog repositories and create pull requests.
c) You send the CT files to mrustler gmx de
===C Utils Misc===
The AROS source uses at several places the __DATE__ macro to fill the date entry of a $VER tag. Problem is that c:version doesn't understand that date format (e.g. "May 21, 2011"). As a result the output of e.g.
> "version c:shell full" contains "(null)". Is extending the version command to understand the format of __DATE__ the right solution for that problem?
AmigaOs compilers should use __AMIGADATE__ macro or similar form, if it isn't implemented it could be emulated in makefile: -D__AMIGADATE__=\"$(shell date "+%d.%m.%Y")\"
BTW. I think DD.MM.YYYY is better format than "Month DD YYY" because "Month DD YYY" is not localized in any way.
"strnicmp" shouldn't work with NULL pointers
The Situation:
compiled a linklib using c++ object files (using the c++ cross compiler).
compiled a C stub that uses the linklib (using the c++ cross compiler).
Try to link them together (using the c++ cross compiler) with C object
files (using the normal target c compiler) that need to use -nostartup
= cant do because using the c++ files pulls in arosc (for stdio etc.) -
so wants to have the autoinit stuff present.
What can I do about this??
If it is possible to manually open it then what do I need to do exactly?
=== ENV ===
The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact. However in some cases (like this one) it is not required.
99% of the time that statement is true (not required) for pretty much every file in ENV: or do people change their default icons - and prefs settings - every boot?
There seem to be a bad habit of late with developers changing things to reflect their own personal preference when the change isn't actually necessary - It would be nice if people could refrain from doing that in the tree without at least discussing it on the dev-list first (and with good reasoning unless they committed said work in the first place..)
We're not keen on the pollution of the "S:" dir: it's meant to be for scripts. What's wrong with "ENV:"?
Only the fact that it takes up RAM. I understand that for PCs with several gigabytes of RAM this is
irrelevant. But let's remember about other machines. The philosophy behind ENV: is that keeping configuration files there allows you to 'Use' preferences by keeping a copy in ENVARC: intact.
However in some cases (like this one) it is not required.
How about implementing in the style of HappyENV then? RAM-disk handler that falls through to reading from ENVARC: if there is no such file stored in it already. Removes RAM usage for unchanged files, removes the need to copy ENVARC to ENV in startup-sequence.
Shouldn't be too hard to make from AmberRAM, or even just extend AmberRAM to provide this service.
Is it feasable to build a special version of AmberRAM handling ENV: that will try and copy the requested file from ENVARC: if it isnt found in ENV: ?
Additionaly it could mark closed "files" as untouched - and expunge them from ENV: after a period of time to free up additional RAM:, or when the system is running low on free memory?
Silenty disappearing files may not be a good plan. Would be nice if the following would work:
ASSIGN :ENV SYS:Prefs/Env-Arc ADD
ASSIGN :ENV RAM:ENV ADD
Where new files put in ENV: end up in RAM:ENV, and opening files looks in RAM:ENV first, then SYS:Prefs/Env-Arc
Well - that's essentially what im proposing but without the assigns - or need for a RAM:ENV directory.
Adding it as a feature of AmberRAM sounds like the most memory efficient way (one handler to load in RAM) but that's only if it is possible to make it handle ENV: additionally to RAM:, and if it is even possible to add the proposed functionality (...and how to make it enable it when accessing ENV:).
===(AS)MP support===
If one has to recompile software for SMP multi core, is there any thing special one has to do to get software to run?
Use task.resource if you need to query information about what tasks are running, and clear msgports completely when they are allocated.
Most code should not need Forbid. Use Semaphores, Messages etc. to sync your own code.
Accessing system structures is a different thing. Use the proper API whenever possible.
How single structures will be protected in the future is still a moving target, at least it is not documented. And you should never use undocumented stuff
Ideas on for SMP multi-core
Another suggestion is ... Forbid/Permit function calls are meant to halt multitasking so as no other task could intervene with what ever the calling task is doing, e.g. setting semaphores. Disable/Enable calls are meant to halt interrupts and as a side effect they also halt task switching.
One option is to make it compulsory to protect shared resources with semaphores and forbid the use of simple Forbid() calls as to protect something. Setting semaphore should be done if possible with atomic instructions (check and alter in one instruction). Or make the second concurrent ObtainSemaphore call halt the second calling task and force if possible a task switch which ever gives better results.
Semaphores could store the owning tasks task pointer instead of boolean to make things easier.
As long as the CPU initiates the DMA transfers through the OS, and the OS ensures that the transferred memory is within the region accessible to the user initiating the transfer, everything is fine. The CPU is the conductor, and the CPU by that has the control of which DMA transfer is initiated and which is not.
All you need to do is to write device drivers reasonable. Hint: CachePreDMA and CachePostDMA exist.
All the Os has to do is to verify that the memory regions to be transferred are valid, and prohibit direct access to the DMA control registers from user space. None of these algorithms imply huge costs.
The current OS design doesn't really allow virtual memory in first place, Forbid() is again the problem.
[http://www.tbs-software.com/guide/index.php?guide=autodocs.doc%2Fmemory.doc&node=1 memory.library API] seem to low level. IMHO the programs should not know how the swapping is implemented. I would just go for one new memory flag
MEMF_SWAPPABLE that indicates that a certain memory region or a whole memory pool won't be accessed during Forbid()/Permit() etc. It only solves part of the problem, it only implements virtual memory and not memory protection. For the latter you need to be able make certain memory inaccessible by other programs, some memory read-only for one task and read-write for other tasks, etc. And I think this should be done in the same Address Space in order to avoid you constantly need to swap between different address spaces.
So to summarize, if there are programs using this API we may provide a wrapper layer to get them working but I am not convinced this API should be the reference API with whom to provide VM to AROS programs.
=== Variadic ===
variadic functions (i.e. functions with an arbitrary amount of arguments).
<pre>
#include <stdarg.h>
[...]
char * STDARGS GetKeyWord(int value, char *def, ...)
{
[...]
va_list va;
[...]
va_start(va, def);
[...]
va_end (args);
</pre>
Please keep with using stdarg rather than having va casted to a LONG * type and varargs handled manually. Doing so, prevents tons of casting, where a simple va_arg can be used. So, string = *((char **) args) instead of string=va_arg(va, char *).
<pre>
#include <stdio.h>
#include <stdarg.h>
int printf (const char * format, ...)
{
int retval;
va_list args;
va_start (args, format);
retval = vfprintf (stdout, format, args);
va_end (args);
fflush (stdout);
return retval;
} /* printf */
</pre>
Couldn't find varargs.h or stdarg.h. and have no use for AROS_SLOWSTACKHOOKS or AROS_SLOWSTACKTAGS.
GCC looks for stdarg.h in a different place:
/bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/include/stdarg.h
Here is a path for a "normal" header:
bin/linux-i386/tools/lib/gcc/i386-aros/4.2.2/../../../../i386-aros/sys-include/aros/system.h
The use of vararg.h isn't supported by newer gcc versions. If you want your code to run on architectures that pass part of variadic arguments in a number of registers you need to use AROS_SLOWSTACK macros. Otherwise your program will not work on powerpc and x86_64 ports.
Of course the SLOWSTACK stuff is not needed in a function that can use va_list, va_start, va_arg and va_end. It's only needed if you want to write functions like DoMethod or similar.
#include <stdarg.h>
should be enough no matter if you do cross or native compiling. If it does not work, something is wrong and should be corrected.
Stdarg.h is here, Development:lib/gcc/i386-aros/4.2.2/include/
...which is part of the compiler's default include paths. In other words, #include <stdarg.h> works out of the box, indeed. (sorry, I should have just tried it before invoking "search" or "find"...)
furthermore, myprintf() as shown above won't work, because...
printf(format, args);
...is wrong - the second argument does not match printf() prototype, it expects a argument list, but args is of type va_list (obviously) - so one has to use...
vfprintf(stdout, format, args);
...instead, just like in the original printf(), and add fflush(stdout).
additionally, one could use...
int myarg = va_arg(args, int);
...between va_start() and va_end() to access individual arguments, where each call to va_arg() returns an argument casted to the desired type (here: "int") from the list given (here: "args") and advances to the next one.
wrapping up vfprintf() and modifying the format string now is a major speedup! no more backslash-n typing! this has been haunting me for years!
On MOS and AmigaOS, the NewObject variadic function is kept in the static library. It takes most of the parameters on the stack - thanks to that the implementation of NewObject calls the NewObjectA function. Everything works perfect, and the typical MUI macros may be easily used.
This, however, is not the case when you compile for AROS. Here, NewObject is a variadic macro, not a function. Thanks such approach we do not need any custom compiler in case of systems, where the arguments of variadic functions are passed partially through registers and partially through the stack (This is the case of PPC and x86_64, this is also the reason why both OS4 and MOS require specially patched compilers).
Since NewObject is a macro, the gcc's preprocessor expects the list of macros arguments enclosed within parentheses. In MUI macros it is not the case. Imagine the following test code:
<pre>
#define foo(a,b) ((a)+(b))
int loosy_function(int a, int b)
{
return foo(a,b);
}
</pre>
This will compile and work, but the following piece of code:
<pre>
#define foo(a,b) ((a)+(b))
#define END )
int loosy_function(int a, int b)
{
return foo(a,b END;
}
</pre>
will fail with the error: unterminated argument list invoking macro "foo"
There are two ways of fixing your issue. Either create your new objects outside this huge MUI constructions, and in there use just a pointer, or get rid of the "End" macro and exchange it with "TAG_DONE)".
Badly written software is, for example, casting va_list to an APTR or even doing so as if va_list were a plain table of function arguments. Such code needs to be fixed because it has very few chances to work anywhere but on author's machine ;)
The problem is nOt that they assume sizeof(APTR) == 4, its that they often do not use APTR, and use ULONG to store pointers exclusively. If the code used APTR/IPTR as it should - most of the "problems" wouldn't exist.
It would also help if people would start using variadic arguments properly. Many coders do assumptions which shall never be made. Instead, they should consider using stdarg.h file and all the va_* functions :)
===ABI===
In the head of our SVN repository there are now only 3 directories:
<pre>
admin/
branches/
trunk/
</pre>
We have added two extra dirs there: tags and imports
As discussed when we branch ABI V0 and [[Aros/Developer/ABIv1|ABI V1]] it would also be good to introduce tags. Normally this is done in a directory in the repository called tags. Currently we don't have this directory there. (We do have branches/tags that is a hack I have done because one doesn't have write access in the top directory. I think this directory is not clean and should be removed).
The second directory I would introduce is an imports directory for implementing vendor branches as discussed in the svn [http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html book]. Currently we use code from several different projects and that code is stored inside the AROS tree; we seem to have problems with keeping this code up to date and merge our changes upstream. Maintainers of up stream projects like the MUI classes etc. have complained about this (to put it lightly).
Introducing these vendor branches would make it easier to see what changes we have made and make patches to be sent upstream and make it easier to import newer upstream versions of their code. Although can't "copy" the vendor branch into the main branch because it's already there, so start with a "merge".
Yes, the first step to make the code already in the repository compatible with the vendor branches will be the most difficult. The best way to do it the following way:
* first import the version on which the current AROS code is based into the vendor branch
* then import the new version over it in the vendor branch
* finally merge the difference between these two version in the AROS code present in the repository.
For example, place NList directly under vendor and not in a subdirectory like "contrib/zune/classes".
Actually after we have a stable [http://aros.sourceforge.net/documentation/developers/specifications/drafts/abiv1.php ABIv1 (2012 or later)]. We need to move away as much as possible from the contrib directory to some other repositories. The reasons are ...
* The AROS repository should be for the core AROS code.
* other contrib projects should be tried to be compiled for all Amiga-like OSes.
* The release scheme for AROS and the other programs should not have to be aligned.
* Binary versions should be provided on aros-archives and on aminet and/or OS4Depot to install them. (Some clever programs should maybe be provided to make the life of distribution developers easier).
* avoid parallel forks of programs for AROS and the other amiga OSes.
If there is really a need for a place for hosting AROS projects we may investigate setting up such a server but then including bug tracking, governance, maillist, etc. for each project separately. I personally think there are already enough places like sourceforge, google code, savannah, etc. where people can go for hosting such projects.
==Links==
* http://amigadocs.hokstad.com
* http://amigadocs.hokstad.com/doku.php?id=dev-links
In the future...?
*AROS 64bit - SMP, Vulkan with OpenGL compability layer
*AROS 32bit - keep for historic reasons
What would you like to see implemented in AROS?
ABIv1 completed, SMP (x86_64), SendMsg()/GetMsg() to support memory protection between target and destination, in that order. Michal Schulz and Jason McMullan have been toying with the question "What are the minimal changes needed to the AmigaOS 3.1 API to support SMP"? The answer so far seems to be "few, but subtle". For example, SysBase->ThisTask is no longer meaningful on SMP, but FindTask(NULL) is. Disable() and Forbid() are shockingly bad on performance, but adding a spinlock semaphore mode to SignalSemaphore will help new code on SMP.
Leveraging a 'common' OS with a lot of machine support (Linux, MacOS, Windows, QNX, etc.) is something that AROS has been doing for quite a long time, and it is the biggest strength of AROS. This AROS experience and programming model, in the same way the Google's Android layers on top of Linux, or MacOS X layers on top of the Darwin/BSD kernel, as a first step
* The graphics + layers subsystem could be implemented as a shim on top of a OpenGL ES implementation (ie on any modern Linux system, or the RaspberryPI's hardware, MacOS X, etc).
- This also allows every window to be on its own 3D surface with backing store, allowing Wanderer (or a Commodity)
rearrange/zoom/animate app windows without having to send a pile or refreshes to them
* Use OpenAL as the sound backend
* AROSTCP would be a thin layer over the native OS's TCP/IP stack
* dos.library, poseidon.library, and input.device would be slim shims over the native APIs
* If we move to loading all libraries' into the application's task space, instead of a single global instance of the library, this will allow SMP and MMU more easily.
- Yes, it will require a lot of work in the libraries to make this transition
- Yes, I do think it will be worth it in the end.
* A 'fat binary' install format (or, maybe LLVM bytecode) that can be 'flattend' to the target architecture on installation.
So, what would this 'AROS of the future' look like?
* AmigaOS 3.x style API, with certain 'fundamental changes' to message passing
* Uses the underlying OS' device drivers, so more AROS developer effort can go to user-visible features and bugfixes
* Allows AROS applications to run side-by-side with the OS's native apps
And why would anyone want to program on such a system?
* AROS applications would run on any system that has the AROS Framework installed
* AROS applications are pixel-for-pixel the same on all platforms.
* Develop with the knowledge that you are guaranteed OpenGL and OpenAL, and the rest of the AROS Framework
an option for mmake to dump its dependency of metatarget in a graphviz[*] input file. This should make it possible to visualize the dependencies and hopefully be inspiration for cleaning up some mess, circular or unneeded dependencies and so on.
AmigaOS gcc 9 [https://franke.ms/amiga/gcc.wiki Old versions] able to create binaries for AmigaOS and [https://eab.abime.net/showthread.php?t=93813 Upgrading gcc versions]
=== AI ===
Please see discussion of the [https://arosworld.org/infusions/forum/viewthread.php?thread_id=1933&rowstart=0 Aros world thread] [https://opencode.ai/ opencode], [https://openrouter.ai/models?categories=programming new opencode models], [https://axrt.org/media/aros-ui-ai.mp4 AI ui],
*DeepSeek V4 Flash - very good model, use it daily but a small monthly fee payable
*Ring 2.6 - good model but pricing small
Multimodal
Context
Prompt
<---
Model <---> Agent ---> End user
engine
Gemini LMStudio
Qwen Comfyui
etc
Recent, self hosting local models on laptops, mini pcs, laptops or desktops with '''quantization''' (compressed) so reducing memory to run on 8Gb+ VRAM and no high end gpu for text based tasks. For smaller models, very specific prompting and chatting (iterations) for very smaller sections of your overall application as lots of supervision needed for the code produced
Ability increases by the amount of ram like the Pi5 8Gb, Macbook 48Gb unified (quality) and the memory bandwidth (how fast)
Roughly...
*DDR4 Pi5 about 17GB/s
*DDR5 about 40Gb/s
*DDR6 about 90Gb/s about Jetson Orin Nano level
* MacBook M3 base 100GB/s Pro 150GB/s Max 200Gb/s unified memory integrated into CPU
* MacBook M4 base 120Gb/s Pro 170Gb/s Max 250Gb/s
* MacBook M5 base 140Gb/s
* MacBook M6 base 160Gb/s Pro 180Gb/s Max
Total VRAM should be greater than Model size (in Gbytes) and context length (you set Gbytes taken) - everything is a trade off
<pre>
Small Lesser Mid Greater Bigger
1-2B 3B 7B 20B 30B model size
Q2 Q2 Q4 Q6 Q8 compressing
4GB 8GB 16GB 32GB 64GB VRAM needed
</pre>
*[https://lmstudio.ai/download LMstudio single gpu],
Alibaba Cloud's [ Qwen] team series of large language models LLMs
*[ Qwen-3.8-27B] for larger machines
*[ Qwen-3.6-27B] for larger machines
*[ Qwen 3.5 9B Q4] for lesser machines
*[ Qwen 2.5 14b Coder] for smaller machines
*[HauHau 3.6 35B]
Small models
*[ glm-ocr]
*[ medGemma]
*[ qwen 3.5-4b]
*[https://github.com/sipeed/picoclaw picoclaw claude]
*[ DeepSeek R1]
For the full experience
#Training learning using 1+ high end GPUs at least 16GB VRAM per GPU card or 64Gb+ of unified, 16Core CPU with at least 64Gb of RAM system memory
#Inference with custom asics or GPUs
For ever bigger LLMs needs one of the below but with settings adjusting
*[https://ollama.com/download Ollama single gpu]
*[https://github.com/ggml-org/llama.cpp/releases llama.CPP multi gpus],
*[ VLM multiple gpus],
*[ MiniMax H3] for audio and video but gpu 8Gb+
*[https://github.com/jamiepine/voicebox voicebox]
*[https://github.com/ideogram-oss/ideogram4 ideogram4]
*[https://github.com/calesthio/OpenMontage OpenMontage]
Multimedia
*[ Kimi K3],
Refactor
*[ Devstral-small-2 256K context]
Coding
*[ gpt-oss-20b 4Q] smaller
*[ Qwen3-coder-next] larger
FIM - Fill in the middle
Mistral Codestral-2 for 64Gb+ unified
<pre>
Text to Audio --\
Text to Video --/ Reference Video --> Video and Audio output
</pre>
Agent = Model + Harness
Agentic
Harnesses like [ Claude Code] could help models. [https://github.com/deepseek-ai/deepseek-harness Deepseek] etc allows many models to reside inside but also everything is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so each is replaceable from configuration
==References==
{{reflist}}
{{status|50%}}
{{BookCat}}
53yqfr0n7au6skv27vr1luxjo0u0y08
Special Relativity
0
57197
4669577
4669489
2026-09-10T12:54:04Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-48940-54|~2026-48940-54]] ([[User talk:~2026-48940-54|talk]]) to last version by Codename Noreste
4519432
wikitext
text/x-wiki
{{featured book|print=Print version|PDF=SpecialRelativity2.12}}
{{Special Relativity}}__NOTOC__
'''The book is divided into two sections''', an introductory text and a more advanced text. Both texts cover the same topics. Undergraduates might compare their curriculum with the text and study appropriately.
== Introductory text ==
{{ModernPhysicsTOC}}
{{Prerequisite|Algebra}}
{{Reading level|Intermediate}}
{{Special Relativity/Section|Introduction|Historical Development}}
{{Special Relativity/Section|Principle of Relativity|The principle of relativity|Frames of reference, events and transformations|Special relativity|The postulates of special relativity}}
{{Special Relativity/Section|Spacetime|The modern approach to special relativity|Spacetime|The lightcone|The Lorentz transformation equations}}
{{Special Relativity/Section|Simultaneity, time dilation and length contraction|The relativity of simultaneity and the Andromeda paradox|The nature of length contraction|Evidence for length contraction, the field of an infinite straight current|De Broglie waves|The twin paradox|The pole barn paradox|Addition of velocities}}
{{Special Relativity/Section|Dynamics|Introduction|Momentum|Force|Mass and energy}}
{{Special Relativity/Section|Aether|Introduction|The aether drag hypothesis|The Michelson-Morley experiment|Mathematical analysis of the Michelson Morley Experiment|Lorentz-Fitzgerald contraction hypothesis}}
{{Special Relativity/Section|Faster than light signals, causality and Special Relativity}}
== Advanced text ==
{{Prerequisite|Calculus}}
{{Prerequisite|Linear Algebra}}
{{Special Relativity/Section|Mathematical transformations|Introduction|The Lorentz transformation|The linearity and homogeneity of spacetime|The Lorentz transformation|Length contraction, time dilation and phase|Hyperbolic geometry|Addition of velocities|Acceleration transformation}}
{{Special Relativity/Section|Waves|Relativistic waves|Principle of Relativity Applied|Characteristics of Relativistic Waves|The Doppler Effect}}
{{Special Relativity/Section|Relativistic dynamics|Introduction|Momentum|Relativistic Mass}}
{{Special Relativity/Section|Mathematical approach|Vectors|Matrices|Linear Transformations|Indicial Notation|Analysis of curved surfaces and transformations}}
* [[Special Relativity/Mathematical approach2|Four vectors]]
'''[[Special Relativity/Problems|Problems]]'''
== Appendices ==
* [[Special Relativity/Mathematical Appendix#Mathematics of the Lorentz Transformation Equations|Mathematics of the Lorentz Transformation Equations]]
== Further Information ==
* [[Modern Physics]]
* [[General Relativity]]
{{Shelves|Relativity}}
{{Alphabetical|S}}
{{status|100%}}
[[de:Spezielle Relativitätstheorie]]
[[el:Ειδική Σχετικότητα]]
[[ja:特殊相対論]]
88rrelddy2gkl99rkpqws6gd958m3j3
German/Level I/Zu Hause essen
0
74291
4669640
4669207
2026-09-11T05:25:28Z
It-is-Truly-Meet
3624460
This page was expanded with the assistance of Preply.com. Exact copy and pastes were not done.
4669640
wikitext
text/x-wiki
{|align="right"
| __TOC__
|}{{Revise}}
= Lesson I.13: Zu Hause essen =
In this lesson, you'll learn about food in supermarkets, meal preparation, and typical German meals.
== Im Supermarkt ==
===Store Areas and Objects===
{| class="wikitable" {{German table|Vocabulary|Entrances, Aisles, and Checkout|Eingänge, Gänge und Kassenbereich|0|2}}
!English||German
|-
|supermarket||der Supermarkt
|-
|entrance||der Eingang
|-
|aisle||der Gang
|-
|shelf||das Regal
|-
|checkout/register||die Kasse
|-
|line/queue||die Schlange
|-
|exit||der Ausgang
|-
|opening hours||die Öffnungszeiten
|}
Using these words, you can speed up your grocery trips by going to the ''richtigen Gang''.
{| class="wikitable" {{German table|Vocabulary|Store Sections|Shop-Bereiche|0|2}}
!English||German
|-
|the bakery section||die Bäckerei
|-
|the butcher counter||die Metzgerei
|-
|the meat counter||die Fleischtheke
|-
|the vegetable section||der Gemüsestand
|-
|the fruit section||die Obsttheke
|-
|the cheese counter||die Käsetheke
|-
|the fish counter||die Fischtheke
|}
Knowing the names of fresh counters helps you navigate efficiently to them.
{| class="wikitable" {{German table|Vocabulary|Checkout|Die Kasse|0|2}}
!English||German
|-
|shopping cart||der Einkaufswagen
|-
|shopping basket||der Einkaufskorb
|-
|receipt||die Quittung
|-
|card reader||das Kartenlesegerät
|-
|loose change||das Kleingeld
|-
|to return food||Essen zurückgeben
|}
Knowing these words will help you understand what a cashier is saying.
===Food by Section===
[[File:Eszterhazy-Torte 01.JPG|thumb|right|Esterházy-torte in a Sopron pastry shop.]]
[[File:Nuernberger Lebkuchen 3183857869 0f3f7bcbe3.jpg|thumb|right|Lebkuchen at the Nuremberg Christmas Market]]
{| class="wikitable" {{German table|Vocabulary|The Backery|Die Bäckerei|0|2}}
!English||German
|-
|bread||das Brot
|-
|sourdough bread||das Sauerteigbrot
|-
|bread roll||das Brötchen
|-
|burger buns||die Burgerbrötchen
|-
|wholemeal||das Vollkorn
|-
|cake||der Kuchen
|-
|pretzel||die Brezel
|-
|croissant||das Croissant
|-
|gingerbread||der Lebkuchen*
|-
|layered cake||die Torte*
|-
|pastries||das Gebäck
|-
|muffin||der Muffin
|-
|cookie/biscuit||der Keks
|-
|icing||die Glasur
|}
<nowiki>*</nowiki>''Lebkuchen'' are spiced cookies sold during Advent.<br>
<nowiki>*</nowiki>''Torte'' is a '''layered''' cake with cream or fruit, different from regular ''Kuchen''.
{| class="wikitable" {{German table|Vocabulary|Fruits|Die Früchte|0|8}}
!English||German||English||German||English||German||English||German
|-
|apple||der Apfel||dragon fruit||die Drachenfrucht||loquat||die Japanische Wollmispel||pineapple||die Ananas
|-
|apricot||die Aprikose||durian||die Durian||lychee||die Litschi||plum||die Pflaume
|-
|banana||die Banane||fig||die Feige||mandarin||die Mandarine||pomegranate||der Granatapfel
|-
|blackberry||die Brombeere||gooseberry||die Stachelbeere||mango||die Mango||prickly pear||die Kaktusfeige
|-
|blueberry||die Blaubeere||grape||die Weintraube||mangosteen||die Mangostane||pomelo||die Pomelo
|-
|boysenberry||die Boysenbeere||grapefruit||die Grapefruit||mamoncillo||die Mamoncillo||pulasan||die Pulasan
|-
|Canary melon||die Kanarienmelone||guava||die Guave||minneola||die Minneola||rambutan||die Rambutan
|-
|cantaloupe||die Cantaloupe-Melone||honeydew melon||die Honigmelone||musk melon||die Zuckermelone||raspberry||die Himbeere
|-
|Casaba melon||die Casaba-Melone||horned melon||die Horngurke||nance||die Nance||satsuma||die Satsuma
|-
|Cherimoya||die Cherimoya||jackfruit||die Jackfrucht||nectarine||die Nektarine||soursop||die Stachelannone
|-
|cherry||die Kirsche||jujube||die Jujube||orange||die Orange||star fruit||die Sternfrucht
|-
|Christmas melon||die Weihnachtsmelone||kiwi||der Kiwi||blood orange||die Blutorange||strawberry||die Erdbeere
|-
|clementine||die Clementine||kumquat||die Kumquat||papaya||die Papaya||tamarillo||die Baumtomate
|-
|cowberry||die Preiselbeere||lemon||die Zitrone||passion fruit||die Passionsfrucht||tangelo||die Tangelo
|-
|Crenshaw melon||die Crenshaw-Melone||lime||die Limette||peach||der Pfirsich||tangerine||die Mandarine
|-
|currant||die Johannisbeere||loganberry||die Loganbeere||pear||die Birne||ugli fruit||die Ugli-Frucht
|-
|date||die Dattel||longan||die Longan||persimmon||die Kaki||watermelon||die Wassermelone
|}
Observe that ''most'' fruits are feminine and that "''Mandarine''" means both "tangerine" and "mandarin."
{| class="wikitable" {{German table|Vocabulary|Vegetables|Die Gemüse|0|8}}
!English||German||English||German||English||German||English||German
|-
|
|}
{| class="wikitable" {{German table|Vocabulary|Dairy and Eggs|Milchprodukte und Eier|0|8}}
!English||German||English||German||English||German||English||German
|-
|
|}
{| class="wikitable" {{German table|Vocabulary|Meat and Seafood|Fleisch und Meeresfrüchte|0|8}}
!English||German||English||German||English||German||English||German
|-
|
|}
===Polite Shopping Phrases===
<noinclude>{{German/Level I/Footer}}</noinclude>
{{BookCat}}
rmiv3e2eiqwdykkniolrqy2cfen71ge
Minix 3/Minix 3 on Bochs
0
80838
4669620
3337820
2026-09-10T17:49:42Z
WereSpielChequers
248949
typo
4669620
wikitext
text/x-wiki
== Run MINIX 3 on Windows XP Bochs ==
The recipe below was successfully tried with Minix versions 3.1.1, 3.1.2, 3.1.2a. The Bochs ver. 2.2.6 was running under (or over?) Windows XP. It also may work on other operating system that support Bochs Environment.
* Download a Minix 3 bootable CD ISO image<ref>[http://www.MINIX3.org/ Official MINIX 3 Operating System site]</ref>. You'll download an archive, unpack it - you'll get the file with name like IDE-3.1.1.iso.
* Download Bochs - in my case,I have used Bochs 2.2.6 released for Windows XP but should work higher version<ref>[http://bochs.sourceforge.net/ Bochs Development Homepage]</ref>.
* Install WinPCap, downloadable from <ref>[http://www.winpcap.org/install/bin/WinPcap_3_1.exe Official site for WinPcap]</ref>.
* Install Bochs - when asked for options, add DLX Linux.
* In the directory where the default installed Bochs will be in ('''C:\Program Files\Bochs-2.2.6''') , you'll find dlxlinux directory.
* You need to make a copy of '''dlxlinux''' in the same parent directory with different name '''minix3'''. This new directory will be your Minix OS versions.
* Go to the new minix3 directory and edit bochsrc.bxrc file.
###############################################################
# bochsrc.txt file for Minix3 disk image.
###############################################################
<br/>
# how much memory the emulated machine will have
megs: '''256'''
<br/>
# filename of ROM images
romimage: file=../BIOS-bochs-latest, address=0xe0000
vgaromimage: file=../VGABIOS-lgpl-latest
<br/>
# what disk images will be used
floppya: 1_44=floppya.img, status=inserted
floppyb: 1_44=floppyb.img, status=inserted
<br/>
# hard disk
'''ata0-slave: type=cdrom, path=IDE-3.1.1.iso, status=inserted'''
<br/>
# choose the boot disk.
boot: '''cdrom'''
<br/>
# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx
<br/>
#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
<br/>
# where do we send log messages?
log: bochsout.txt
<br/>
# disable the mouse, since DLX is text only
mouse: enabled=0
<br/>
'''# ne2k: NE2000 compatible ethernet adapter'''
'''ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=win32, ethdev=MYCARD'''
<br/>
# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so
# in the Minix3 example I'm enabling keyboard_mapping so that paste
# will work. Cut&Paste is currently implemented on win32 and X windows only.
<br/>
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-fr.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-de.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-es.map
<br/>
* Run Boch's NIC Lister. For a few ordinary Windows XP machines with one network card NIC Lister mentions three interfaces, and some of them usually works.
* Put the IDE-3.1.1.iso file with Minix 3 bootable CD image into minix3 directory.
* Edit the run.bat file in the minix3 directory - replace dlxlinux with minix3 on the first line in the path.
# Run.bat
cd "C:\Program Files\Bochs-2.3\'''minix3'''"
..\bochs -q -f bochsrc.bxrc
* Run run.bat - you'll get Minix 3 booting in the virtual Bochs PC.
== Install Minix onto a Virtual Hard Drive ==
The step below work on any Bochs Environment and doesn't depend on the operating system
* Create the file for that drive first. Launch the Disk Image Creation Tool, which is included into Bochs distribution. The interface is very simple - the program just asks a few questions and does the job, but just in case, you'll wand a hard drive (hd) disk image, of flat (flat) type, sized, for example, 2048 megabytes (2048) - it will actually be 8192 bytes less than that - named hd2gig.img.
* You'll need to edit bochsrc.bxrc again. The line in hard disk section, related to disk - if you took the bochsrc.bxrc from dlxlinux, it will contain
# hard disk
"ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17"
should contain the line, which Disk Image Creation Tool put into clipboard, namely,
# hard disk
"ata0-master: type=disk, path="hd2gig.img", mode=flat, cylinders=4161, heads=16, spt=63"
* Relaunch Minix booting from cdrom, login as root, run "setup", which will install Minix on the virtual hard drive. The network will get installed as well.
* After installation is complete, run "shutdown", in boot monitor run "off" so Bochs will turn down, and change "boot: cdrom" to "boot: disk", so you'll boot next time from virtual disk instead of cdrom.
== References ==
<references />
{{BookCat}}
n0c6qf9j606v2lzz6wot8r59d4de2sc
Human Physiology/Cell physiology
0
86634
4669609
4609738
2026-09-10T14:54:19Z
~2026-49028-44
3625633
/* What is a Cell? */
4669609
wikitext
text/x-wiki
{{Human Physiology|Homeostasis|Integumentary System}}
==Cell Structure and Function==
=== What is a Cell? ===
A '''cell''' is a structure as well as a functional unit of life. Every living thing has cells: '''bacteria, protozoans, fungi, plants, and animals''' are the <ref>{{Cite web |title=Penguin Prof's Physiology Bot 🐧 |url=https://www.playlab.ai/project/cm7v76zxa0585kjzl03m5e4mr |url-status=live |access-date=2026-09-10 |website=Playlab |language=en}}</ref>main group of living things. Some organisms are made up of just one cell are called '''unicellular'''. (e.g. bacteria and protozoans), but animals, including human beings, are '''multi-cellular.''' An adult human body is composed of about 100,000,000,000,000 cells! Each cell has basic requirements to sustain it, and the body's organ systems are largely built around providing the many trillions of cells with those basic needs (such as oxygen, food, and waste removal).
There are about 200 different kinds of specialized cells in the human body. When many identical cells are organized together it is called a tissue (such as muscle tissue, nervous tissue, etc). Various tissues organized together for a common purpose are called organs (e.g. the stomach is an organ, and so is the skin, the brain, and the uterus).
Ideas about cell structure have changed considerably over the years. Early biologists saw cells as simple membranous sacs containing fluid and a few floating particles. Today's biologists know that cells are inconceivably more complex than this. Therefore, a strong knowledge of the various cellular organelles and their functions is important to any physiologist. If a person's cells are healthy, then that person is healthy. All physiological processes, disease, growth and development can be described at the cellular level.
=== Specialized Cells of the Human Body ===
Although there are specialized cells - both in structure and function - within the body, all cells have similarities in their structural organization and metabolic needs (such as maintaining energy levels via conversion of carbohydrate to ATP and using genes to create and maintain proteins).
Here are some of the different types of specialized cells within the human body.
* '''Nerve Cells''': Also called neurons, these cells are in the nervous system and function to process and transmit information (it is hypothesized). They are the core components of the brain, spinal cord, and peripheral nerves. They use chemical synapses that can evoke electrical signals, called action potentials, to relay signals throughout the body.
* '''Epithelial cells''': Functions of epithelial cells include secretion, absorption, protection, transcellular transport, sensation detection, and selective permeability. Epithelium lines both the outside (skin) and the inside cavities and lumen of bodies.
* '''Exocrine cells''': These cells secrete products through ducts, such as mucus, sweat, or digestive enzymes. The products of these cells go directly to the target organ through the ducts. For example, the bile from the gallbladder is carried directly into the duodenum via the bile duct.
* '''Endocrine cells''': These cells are similar to exocrine cells, but secrete their products directly into the bloodstream instead of through a duct. Endocrine cells are found throughout the body but are concentrated in hormone-secreting glands such as the pituitary. The products of the endocrine cells go throughout the body in the bloodstream but act on specific organs by receptors on the cells of the target organs. For example, the hormone estrogen acts specifically on the uterus and breasts of females because there are estrogen receptors in the cells of these target organs.
* '''Blood Cells''': The most common types of blood cells are:
** '''red blood cells (erythrocytes)'''. The main function of red blood cells is to collect oxygen in the lungs and deliver it through the blood to the body tissues. Gas exchange is carried out by simple diffusion.
** various types of '''white blood cells (leukocytes)'''. They are produced in the bone marrow and help the body to fight infectious disease and foreign objects in the immune system. White cells are found in the circulatory system, lymphatic system, spleen, and other body tissues.
===Cell Size===
Cells are the smallest structural & functional living units within our body, but play a big role in making our body function properly. Many cells never have a large increase in size like eggs, after they are first formed from a parental cell. Typical stem cells reproduce, double in size, then reproduce again. Most Cytosolic contents such as the endomembrane system and the cytoplasm easily scale to larger sizes in larger cells. If a cell becomes too large, the normal cellular amount of DNA may not be adequate to keep the cell supplied with RNA. Large cells often replicate their chromosomes to an abnormally high amount or become multinucleated. Large cells that are primarily for nutrient storage can have a smooth surface membrane, but metabolically active large cells often have some sort of folding of the cell surface membrane in order to increase the surface area available for transport functions.
===Cellular Organization===
Several different molecules interact to form organelles within our body. Each type of organelle has a specific function. Organelles perform the vital functions that keep our cells alive.
==== Cell Membranes ====
The boundary of the cell, sometimes called the plasma membrane, separates internal metabolic events from the external environment and controls the movement of materials into and out of the cell. This membrane is very selective about what it allows to pass through; this characteristic is referred to as "selective permeability." For example, it allows oxygen and nutrients to enter the cell while keeping toxins and waste products out.
The plasma membrane is a double phospholipid membrane, or a lipid bilayer, with the nonpolar hydrophobic tails pointing toward the inside of the membrane and the polar hydrophilic heads forming the inner and outer surfaces of the membrane.
[[Image:Cell membrane drawing-en.svg|center|framed|The molecular structure of the cell membrane.]]22
==== Protein and Cholesterol ====
Proteins and cholesterol molecules are scattered throughout the flexible phospholipid membrane. Peripheral proteins attach loosely to the inner or outer surface of the plasma membrane. Integral proteins lie across the membrane, extending from inside to outside. A variety of proteins are scattered throughout the flexible matrix of phospholipid molecules, somewhat like icebergs floating in the ocean, and this is termed the ''fluid mosaic model'' of the cell membrane.
The phospholipid bilayer is selectively permeable. Only small, uncharged polar molecules can pass freely across the membrane. Some of these molecules are H<sub>2</sub>O and CO<sub>2</sub>, hydrophobic (nonpolar) molecules like O<sub>2</sub>, and lipid soluble molecules such as hydrocarbons. Other molecules need the help of a membrane protein to get across. There are a variety of membrane proteins that serve various functions:
* '''Channel proteins''': Proteins that provide passageways through the membranes for certain hydrophilic or water-soluble substances such as polar and charged molecules. No energy is used during transport, hence this type of movement is called facilitated diffusion.
* '''Transport proteins''': Proteins that spend energy (ATP) to transfer materials across the membrane. When energy is used to provide passageway for materials, the process is called active transport.
* '''Recognition proteins''': Proteins that distinguish the identity of neighboring cells. These proteins have oligosaccharide or short polysaccharide chains extending out from their cell surface.
* '''Adhesion proteins''': Proteins that attach cells to neighboring cells or provide anchors for the internal filaments and tubules that give stability to the cell.
* '''Receptor proteins''': Proteins that initiate specific cell responses once hormones or other trigger molecules bind to them.
* '''Electron transfer proteins''': Proteins that are involved in moving electrons from one molecule to another during chemical reactions.
====Passive Transport Across the Cell Membrane====
'''Passive transport''' describes the movement of substances down a concentration gradient and does not require energy use.
* '''Bulk flow''' is the collective movement of substances in the same direction in response to a force, such as pressure. Blood moving through a vessel is an example of bulk flow.
* '''Simple diffusion''', or diffusion, is the net movement of substances from an area of higher concentration to an area of lower concentration. This movement occurs as a result of the random and constant motion characteristic of all molecules, (atoms or ions) and is independent from the motion of other molecules. Since, at any one time, some molecules may be moving against the gradient and some molecules may be moving down the gradient, although the motion is random, the word "net" is used to indicate the overall, eventual end result of the movement.
* '''Facilitated diffusion''' is the diffusion of solutes through channel proteins in the plasma membrane. Water can pass freely through the plasma membrane without the aid of specialized proteins (though facilitated by aquaporins).
* '''Osmosis''' is the diffusion of water molecules across a selectively permeable membrane. When water moves into a body by osmosis, hydrostatic pressure or osmotic pressure may build up inside the body.
* '''Dialysis''' is the diffusion of solutes across a selectively permeable membrane.
====Active Transport Across the Cell Membrane====
'''Active transport''' is the movement of solutes against a gradient and requires the expenditure of energy, usually in the form of ATP. Active transport is achieved through one of these two mechanisms:
=====Protein Pumps=====
* Transport proteins in the plasma membrane transfer solutes such as small ions (Na<sup>+</sup>, K<sup>+</sup>, Cl<sup>-</sup>, H<sup>+</sup>), amino acids, and monosaccharides.
* The proteins involved with active transport are also known as '''ion pumps'''.
* The protein binds to a molecule of the substance to be transported on one side of the membrane, then it uses the released energy (ATP) to change its shape, and releases it on the other side.
* The protein pumps are specific, there is a different pump for each molecule to be transported.
* Protein pumps are catalysts in the splitting of ATP → ADP + phosphate, so they are called '''ATPase enzymes'''.
** The sodium-potassium pump (also called the Na<sup>+</sup>/K<sup>+</sup>-ATPase enzyme) actively moves sodium out of the cell and potassium into the cell. These pumps are found in the membrane of virtually every cell, and are essential in transmission of nerve impulses and in muscular contractions.
'''Cystic fibrosis''' is a genetic disorder that results in a mutated chloride ion channel. By not regulating chloride secretion properly, water flow across the airway surface is reduced and the mucus becomes dehydrated and thick.
=====Vesicular Transport=====
* Vesicles or other bodies in the cytoplasm move macromolecules or large particles across the plasma membrane. Types of '''vesicular''' '''transport''' include:
# '''Exocytosis''', which describes the process of vesicles fusing with the plasma membrane and releasing their contents to the outside of the cell. This process is common when a cell produces substances for export.
# '''Endocytosis''', which describes the capture of a substance outside the cell when the plasma membrane merges to engulf it. The substance subsequently enters the cytoplasm enclosed in a vesicle.
: There are three kinds of endocytosis:
:* '''Phagocytosis''' or cellular eating, occurs when the dissolved materials enter the cell. The plasma membrane engulfs the solid material, forming a phagocytic vesicle.
:* '''Pinocytosis''' or cellular drinking occurs when the plasma membrane folds inward to form a channel allowing dissolved substances to enter the cell. When the channel is closed, the liquid is encircled within a pinocytic vesicle.
:* '''Receptor-mediated endocytosis''' occurs when specific molecules in the fluid surrounding the cell bind to specialized receptors in the plasma membrane. As in pinocytosis, the plasma membrane folds inward and the formation of a vesicle follows.
:: '''Note:''' Certain hormones are able to target specific cells by receptor-mediated endocytosis.
==Parts of the Cell==
[[Image:Animal_cell_structure_en.svg]]
===Cytoplasm===
The gel-like material within the cell membrane is referred to as the cytoplasm. It is a fluid matrix, the cytosol, which consists of 80% to 90% water, salts, organic molecules and many enzymes that catalyze reactions, along with dissolved substances such as proteins and nutrients. The cytoplasm plays an important role in a cell, serving as a "molecular soup" in which organelles are suspended and held together by a fatty membrane.
Within the plasma membrane of a cell, the cytoplasm surrounds the nuclear envelope and the cytoplasmic organelles. It plays a mechanical role by moving around inside the membrane and pushing against the cell membrane helping to maintain the shape and consistency of the cell and again, to provide suspension to the organelles. It is also a storage space for chemical substances indispensable to life, which are involved in vital metabolic reactions, such as anaerobic glycolysis and protein synthesis.
The cell membrane keeps the cytoplasm from leaking out. It contains many different organelles which are considered the insoluble constituents of the cytoplasm, such as the mitochondria, lysosomes, peroxysomes, ribosomes, several vacuoles and cytoskeletons, as well as complex cell membrane structures such as the endoplasmic reticulum and the Golgi apparatus that each have specific functions within the cell.
*'''Cytoskeleton'''
Threadlike proteins that make up the cytoskeleton continually reconstruct to adapt to the cell's constantly changing needs. It helps cells maintain their shape and allows cells and their contents to move. The cytoskeleton allows certain cells such as neutrophils and macrophages to make amoeboid movements.
The network is composed of three elements: <u>microtubules</u>, actin filaments, and intermediate fibers.
*'''Microtubules'''
Microtubules function as the framework along which organelles and vesicles move within a cell. They are the thickest of the cytoskeleton structures. They are long hollow cylinders, composed of protein subunits, called tubulin. Microtubules form mitotic spindles, the machinery that partitions chromosomes between two cells in the process of cell division. Without mitotic spindles cells could not reproduce.
Microtubules, intermediate filaments, and microfilaments are three protein fibers of decreasing diameter, respectively. All are involved in establishing the shape or movements of the cytoskeleton, the internal structure of the cell.
[[Image:MEF microfilaments.jpg|left|thumb|A photograph of microfilaments.]]
*'''Microfilaments'''
Microfilaments provide mechanical support for the cell, determine the cell shape, and in some cases enable cell movements. They have an arrow-like appearance, with a fast growing plus or barbed end and a slow growing minus or pointed end. They are made of the protein actin and are involved in cell motility. They are found in almost every cell, but are predominant in muscle cells and in the cells that move by changing shape, such as phagocytes (white blood cells that scour the body for bacteria and other foreign invaders).
===Organelles===
Organelles are bodies embedded in the cytoplasm that serve to physically separate the various metabolic activities that occur within cells. The organelles are each like separate little factories, each organelle is responsible for producing a certain product that is used elsewhere in the cell or body.
Cells of all living things are divided into two broad categories: prokaryotes and eukaryotes. Bacteria (and archea) are prokaryotes, which means they lack a nucleus or other membrane-bound organelles. Eukaryotes include all protozoans, fungi, plants, and animals (including humans), and these cells are characterized by a nucleus (which houses the chromosomes) as well as a variety of other organelles. Human cells vary considerably (consider the differences between a bone cell, a blood cell, and a nerve cell), but most cells have the features described below.
[[Image:Celltypes.png|center|framed|A comparison of Eukaryote and Prokaryote cells.]]
====Nucleus====
Controls the cell; houses the genetic material (DNA). The nucleus is the largest of the cells organelles. Cells can have more than one nucleus or lack a nucleus all together. Skeletal muscle cells contain more than one nucleus whereas red blood cells do not contain a nucleus at all. The nucleus is bounded by the nuclear envelope, a phospholipid bilayer similar to the plasma membrane. The space between these two layers is the nucleolemma Cisterna.
The nucleus contains the DNA, as mentioned above, the hereditary information in the cell. Normally the DNA is spread out within the nucleus as a threadlike matrix called chromatin. When the cell begins to divide, the chromatin condenses into rod-shaped bodies called chromosomes, each of which, before dividing, is made up of two long DNA molecules and various histone molecules. The histones serve to organize the lengthy DNA, coiling it into bundles called nucleosomes. Also visible within the nucleus are one or more nucleoli, each consisting of DNA in the process of manufacturing the components of ribosomes. Ribosomes are shipped to the cytoplasm where they assemble amino acids into proteins. The nucleus also serves as the site for the separation of the chromosomes during cell division.
[[Image:Diagram human cell nucleus multilang.svg|left|thumb|A cross-sectional diagram of a nucleus.]]
*'''Chromosomes'''
[[Image:Chromosome.png|right|framed|A rough sketch of a chromosome.]]
Inside each cell nucleus are chromosomes. Chromosomes are made up of chromatin, which is made up of protein and deoxyribonucleic acid strands. Deoxyribonucleic acid is DNA, the genetic material that is in the shape of a twisted ladder, also called the double helix. Humans have 23 pairs of chromosomes. Down Syndrome and Cri du Chat Syndrome result from having an abnormal number of chromosomes.
====Centrioles====
Centrioles are rod like structures composed of 9 bundles which contain three microtubules each. Two perpendicularly placed centrioles surrounded by proteins make up the centrosome. Centrioles are very important in cellular division, where they arrange the mitotic spindles that pull the chromosome apart.
Centrioles and basal bodies act as microtubule organizing centers. A pair of centrioles (enclosed in a centrosome) located outside the nuclear envelope gives rise to the microtubules that make up the spindle apparatus used during cell division. Basal bodies are at the base of each flagellum and cilium and appear to organize their development.
====Ribosomes====
[[Image:Ribosome structure.png|center|framed]]
Ribosomes play an active role in the complex process of protein synthesis, where they serve as the structures that facilitate the joining of amino acids. Each ribosome is composed of a large and small subunit which are made up of ribosomal proteins and ribosomal RNAs. They can either be found in groups called polyribosomes within the cytoplasm or found alone. Occasionally they are attached to the endoplasmic reticulum.
[[Image:Diagram of a human mitochondrion.png|right|thumb|A cutaway view inside a mitochondria.]]
====Mitochondria====
Mitochondria are the organelles that function as the cell "powerhouse", generating ATP, the universal form of energy used by all cells. It converts food nutrients such as glucose, to a fuel (ATP) that the cells of the body can use. Mitochondria are tiny sac-like structures found near the nucleus. Little shelves called cristae are formed from folds in the inner membrane. Cells that are metabolically active such as muscle, liver and kidney cells have high energy requirements and therefore have more mitochondria.
Mitochondria are unique in that they have their own mitochondrial DNA (separate from the DNA that is in the nucleus). It is believed that eukaryotes evolved from one cell living inside another cell, and mitochondria share many traits with free-living bacteria (similar chromosome, similar ribosomes, etc).
====Endoplasmic Reticulum====
:'''Endoplasmic''' means "within the plasm" and '''reticulum''' means "network".
A complex three dimensional internal membrane system of flattened sheets, sacs and tubes, that play an important role in making proteins and shuttling cellular products; also involved in metabolisms of fats, and the production of various materials. In cross-section, they appear as a series of maze-like channels, often closely associated with the nucleus. When ribosomes are present, the rough ER connects polysaccharide groups to the polypeptides as they are assembled by the ribosomes. Smooth ER, without ribosomes, is responsible for various activities, including the synthesis of lipids and hormones, especially in cells that produce these substances for export from the cell.
Rough endoplasmic reticulum has characteristic bumpy appearance due to the multitude of ribosomes coating it. It is the site where proteins not destined for the cytoplasm are synthesized.
Smooth endoplasmic reticulum provides a variety of functions, including lipid synthesis and degradation, and calcium ion storage. In liver cells, the smooth ER is involved in the breakdown of toxins, drugs, and toxic byproducts from cellular reactions.
====Golgi Apparatus====
"Packages" cellular products in sacs called vesicles so that the products can cross the cell membrane and exit the cell. The '''Golgi apparatus''' is the central delivery system for the cell. It is a group of flattened sacs arranged much like a stack of bowls. They function to modify and package proteins and lipids into vesicles, small spherically shaped sacs that bud from the ends of a Golgi apparatus. Vesicles often migrate to and merge with the plasma membrane, releasing their contents outside the cell. The Golgi apparatus also transports lipids and creates lysosomes and organelles involved in digestion.
====Vacuoles====
Spaces in the cytoplasm that sometimes serve to carry materials to the cell membrane for discharge to the outside of the cell. '''Vacuoles''' are formed during endocytosis when portions of the cell membrane are pinched off.
====Lysosomes====
Lysosomes are sac-like compartments that contain a number of powerful degradative enzymes. They are built in the Golgi apparatus. They break down harmful cell products and waste materials, cellular debris, and foreign invaders such as bacteria, and then force them out of the cell. Tay-Sachs disease and Pompe's disease are just two of the malfunctions of lysosomes or their digestive proteins.
====Peroxisomes====
Organelles in which oxygen is used to oxidize substances, breaking down lipids and detoxifying certain chemicals. Peroxisomes self replicate by enlarging and then dividing.
They are common in liver and kidney cells that break down potentially harmful substances. Peroxisomes can convert hydrogen peroxide, a toxin made of H<sub>2</sub>O<sub>2</sub> to H<sub>2</sub>O.
===Extracellular structures===
*'''Extracellular matrix'''
Human cells, like other animal cells, do not have a rigid cell wall. Human cells do have an important and variable structure outside of their cell membrane called the extracellular matrix. Sometimes this matrix can be extensive and solid (examples = calcified bone matrix, cartilage matrix), while other times it consists of a layer of extracellular proteins and carbohydrates. This matrix is responsible for cells binding to each other and is incredibly important in how cells physically and physiologically interact with each other.
*'''Flagella'''
Many prokaryotes have flagella, allowing, for example, an ''E. coli'' bacteria to propel its way up the urethra to cause a UTI (Urinary Tract Infection). Human cells, however (and in fact most eukaryotic cells) lack flagella. This makes sense since humans are multicellular, and individual cells do not need to swim around. The obvious exception to this is with sperm, and indeed each sperm is propelled by a single flagellum. The flagellum of sperm is composed of microtubules.
*'''Cilia'''
Cilia are especially notable on the single-celled protozoans, where they beat in synchrony to move the cells nimbly through the water. They are composed of extensions of the cell membrane that contain microtubules. When present in humans they are typically found in large numbers on a single surface of the cells, where rather than moving cells, they move materials. The ''mucociliary escalator'' of the respiratory system consists of mucus-secreting cells lining the trachea and bronchi, and ciliated epithelial cells that move the mucus ever-upward. In this manner mold spores, bacteria, and debris are caught in the mucus, removed from the trachea, and pushed into the esophagus (to be swallowed into a pit of acid). In the oviducts cilia move the ovum from the ovary to the uterus, a journey which takes a few days.
[[Image:Cilia.jpg|right|framed|A magnified view of several cells, with visible cilia.]]
==Cell Junctions ==
The plasma membranes of adjacent cells are usually separated by extracellular fluids that allow transport of nutrients and wastes to and from the bloodstream. In certain tissues, however, the membranes of adjacent cells may join and form a junction. Three kinds of cell junctions are recognized:
*'''Desmosomes''' are protein attachments between adjacent cells. Inside the plasma membrane, a desmosome bears a disk shaped structure from which protein fibers extend into the cytoplasm. Desmosomes act like spot welds to hold together tissues that undergo considerable stress, such as our skin or heart muscle.
*'''Tight junctions''' are tightly stitched seams between cells. The junction completely encircles each cell, preventing the movement of material between the cell. Tight junctions are characteristic of cells lining the digestive tract, where materials are required to pass through cells,rather than intercellular spaces, to penetrate the bloodstream.
*'''Gap junctions''' are narrow tunnels that directly connect the cytoplasm of two neighbouring cells, consisting of proteins called connexons. These proteins allow only the passage of ions and small molecules. In this manner, gap junctions allow communication between cells through the exchange of materials or the transmission of electrical impulses.
==Cell Metabolism==
'''Cell metabolism''' is the total energy released and consumed by a cell. Metabolism describes all of the chemical reactions that are happening in the body. Some reactions, called anabolic reactions, create needed products. Other reactions, called catabolic reactions, break down products. Your body is performing both anabolic and catabolic reactions at the same time and around the clock, twenty four hours a day, to keep your body alive and functioning. Even while you sleep, your cells are busy metabolizing.
*'''Catabolism''': The energy releasing process in which a chemical or food is used (broken down) by degradation or decomposition, into smaller pieces.
*'''Anabolism''': Anabolism is just the opposite of catabolism. In this portion of metabolism, the cell consumes energy to produce larger molecules via smaller ones.
===Energy Rich Molecules===
====Adenosine Triphosphate (ATP)====
[[Image:Adenosintriphosphat.svg|thumb|Chemical diagram of an ATP molecule.]]
ATP is the currency of the cell. When the cell needs to use energy such as when it needs to move substances across the cell membrane via the active transport system, it "pays" with molecules of ATP. The total quantity of ATP in the human body at any one time is about 0.1 Mole. The energy used by human cells requires the hydrolysis of 200 to 300 moles of ATP daily. This means that each ATP molecule is recycled 2000 to 3000 times during a single day. ATP cannot be stored, hence its consumption must closely follow its synthesis. On a per-hour basis, 1 kilogram of ATP is created, processed and then recycled in the body. Looking at it another way, a single cell uses about 10 million ATP molecules per second to meet its metabolic needs, and recycles all of its ATP molecules about every 20-30 seconds.
====Flavin Adenine Dinucleotide (FAD)====
When two hydrogen atoms are bonded, FAD is reduced to FADH<sub>2</sub> and is turned into an energy-carrying molecule. FAD accommodates two equivalents of Hydrogen; both the hydride and the proton ions. This is used by organisms to carry out energy requiring processes. FAD is reduced in the citric acid cycle during aerobic respiration
====Nicotinamide Adenine Dinucleotide (NADH)====
Nicotinamide adenine dinucleotide (NAD<sup>+</sup>) and nicotinamide adenine dinucleotide phosphate (NADP) are two important cofactors found in cells. NADH is the reduced form of NAD<sup>+</sup>, and NAD<sup>+</sup> is the oxidized form of NADH. It forms NADP with the addition of a phosphate group to the 2' position of the adenosyl nucleotide through an ester linkage.
NAD is used extensively in glycolysis and the citric acid cycle of cellular respiration. The reducing potential stored in NADH can be converted to ATP through the electron transport chain or used for anabolic metabolism. ATP "energy" is necessary for an organism to live. Green plants obtain ATP through photosynthesis, while other organisms obtain it by cellular respiration.
NADP is used in anabolic reactions, such as fat acid and nucleic acid synthesis, that require NADPH as a reducing agent. In chloroplasts, NADP is an oxidising agent important in the preliminary reactions of photosynthesis. The NADPH produced by photosynthesis is then used as reducing power for the biosynthetic reactions in the Calvin cycle of photosynthesis.
[[Image:NADH.GIF|right|thumb|Chemical diagram of an NADH molecule.]]
MH<sub>2</sub> + NAD<sup>+</sup> → NADH + H<sup>+</sup> + M: + energy, where M is a metabolite.
Two hydrogen ions (a hydride ion and an H<sup>+</sup> ion) are transferred from the metabolite. One electron is transferred to the positively-charged nitrogen, and one hydrogen attaches to the carbon atom opposite to the nitrogen.
The human body synthesizes NAD from the vitamin niacin in the form of nicotinic acid or nicotinamide.
====Cellular Respiration====
Cellular respiration is the energy releasing process by which sugar molecules are broken down by a series of reactions and the chemical energy gets converted to energy stored in ATP molecules. The reactions that convert the fuel (glucose) to usable cellular energy (ATP) are glycolysis, the Krebs cycle (sometimes called the citric acid cycle), and the electron transport chain. Altogether these reactions are referred to as "cellular respiration" or "aerobic respiration." Oxygen is needed as the final electron acceptor, and carrying out cellular respiration is the very reason we breathe and the reason we eat.
[[Image:Cellular respiration flowchart (en).svg|center|framed|Flowchart of cellular respiration.]]
===Glycolysis===
The glycolytic pathway (glycolysis) is where glucose, the smallest molecule that a carbohydrate can be broken into during digestion, gets oxidized and broken into two 3-carbon molecules (pyruvates), which are then fed into the Kreb's Cycle. Glycolysis is the beginning of cellular respiration and takes place in the cytoplasm. Two molecules of ATP are required for glycolysis, but four are produced so there is a net gain of two ATP per glucose molecule. Two NADH molecules transfer electrons (in the form of hydrogen ions) to the electron transport chain in the mitochondria, where they will be used to generate additional ATP. During physical exertion when the mitochondria are already producing the maximum ATP possible with the amount of oxygen available, glycolysis can continue to produce an additional 2 ATP per glucose molecule without sending the electrons to the mitochondria. However, during this ''anaerobic respiration'' lactic acid is produced, which may accumulate and lead to temporary muscle cramping.
===Krebs Cycle===
The Krebs cycle was named after [[:wikipedia:Hans_Adolf_Krebs|Sir Hans Krebs]] (1900-1981), who proposed the key elements of this pathway in 1937 and was awarded the Nobel Prize in Medicine for its discovery in 1953.
Two molecules of pyruvate enter the Krebs cycle, which is called the aerobic pathway because it requires the presence of oxygen in order to occur. This cycle is a major biological pathway that occurs in humans and every plant and animal.
After glycolysis takes place in the cell's cytoplasm, the pyruvic acid molecules travel into the interior of the mitochondrion. Once the pyruvic acid is inside, carbon dioxide is enzymatically removed from each three-carbon pyruvic acid molecule to form acetic acid. The enzyme then combines the acetic acid with an enzyme, coenzyme A, to produce acetyl coenzyme A, also known as acetyl CoA.
Once acetyl CoA is formed, the Krebs cycle begins. The cycle is split into eight steps, each of which will be explained below.
* Step 1: The acetic acid subunit of acetyl CoA is combined with oxaloacetate to form a molecule of citrate. The acetyl coenzyme A acts only as a transporter of acetic acid from one enzyme to another. After Step 1, the coenzyme is released by hydrolysis so that it may combine with another acetic acid molecule to begin the Krebs cycle again.
* Step 2: The citric acid molecule undergoes an isomerization. A hydroxyl group and a hydrogen molecule are removed from the citrate structure in the form of water. The two carbons form a double bond until the water molecule is added back. Only now, the hydroxyl group and hydrogen molecule are reversed with respect to the original structure of the citrate molecule. Thus, isocitrate is formed.
* Step 3: In this step, the isocitrate molecule is oxidized by a NAD molecule. The NAD molecule is reduced by the hydrogen atom and the hydroxyl group. The NAD binds with a hydrogen atom and carries off the other hydrogen atom leaving a carbonyl group. This structure is very unstable, so a molecule of CO<sub>2</sub> is released creating alpha-ketoglutarate.
* Step 4: In this step, our friend, coenzyme A, returns to oxidize the alpha-ketoglutarate molecule. A molecule of NAD is reduced again to form NADH and leaves with another hydrogen. This instability causes a carbonyl group to be released as carbon dioxide and a thioester bond is formed in its place between the former alpha-ketoglutarate and coenzyme A to create a molecule of succinyl-coenzyme A complex.
* Step 5: A water molecule sheds its hydrogen atoms to coenzyme A. Then, a free-floating phosphate group displaces coenzyme A and forms a bond with the succinyl complex. The phosphate is then transferred to a molecule of GDP to produce an energy molecule of GTP. It leaves behind a molecule of succinate.
* Step 6: In this step, succinate is oxidized by a molecule of FAD (Flavin adenine dinucleotide). The FAD removes two hydrogen atoms from the succinate and forces a double bond to form between the two carbon atoms, thus creating fumarate.
* Step 7: An enzyme adds water to the fumarate molecule to form malate. The malate is created by adding one hydrogen atom to a carbon atom and then adding a hydroxyl group to a carbon next to a terminal carbonyl group.
* Step 8: In this final step, the malate molecule is oxidized by a NAD molecule. The carbon that carried the hydroxyl group is now converted into a carbonyl group. The end product is oxaloacetate which can then combine with acetyl-coenzyme A and begin the Krebs cycle all over again.
* Summary: In summary, three major events occur during the Krebs cycle. One GTP (guanosine triphosphate) is produced which eventually donates a phosphate group to ADP to form one ATP; three molecules of NAD are reduced; and one molecule of FAD is reduced. Although one molecule of GTP leads to the production of one ATP, the production of the reduced NAD and FAD are far more significant in the cell's energy-generating process. This is because NADH and FADH<sub>2</sub> donate their electrons to an electron transport system that generates large amounts of energy by forming many molecules of ATP.
To see a visual summary of "Kreb Cycle" please [http://homepage.smc.edu/hodson_kent/Energetics/Krebs2.htm click here].
===Electron Transport System===
The most complicated system of all. In the respiration chain, oxidation and reduction reactions occur repeatedly as a way of transporting energy. The respiratory chain is also called the electron transport chain. At the end of the chain, oxygen accepts the electron and water is produced.
====Redox Reaction====
This is a simultaneous oxidation-reduction process whereby cellular metabolism occurs, such as the oxidation of sugar in the human body, through a series of very complex electron transfer processes.
The chemical way to look at redox processes is that the substance being oxidized transfers electrons to the substance being reduced. Thus, in the reaction, the substance being oxidized (aka. the reducing agent) loses electrons, while the substance being reduced (aka. the oxidizing agent) gains electrons. Remember: LEO (Losing Electrons is Oxidation) the lion says GER (Gaining Electrons is Reduction); or alternatively: OIL (Oxidation is Loss) RIG (Reduction is Gain).
The term redox state is often used to describe the balance of NAD<sup>+</sup>/NADH and NADP<sup>+</sup>/NADPH in a biological system such as a cell or organ. The redox state is reflected in the balance of several sets of metabolites (e.g., lactate and pyruvate, β-hydroxybutyrate and acetoacetate) whose interconversion is dependent on these ratios. An abnormal redox state can develop in a variety of deleterious situations, such as hypoxia, shock, and sepsis.
==Cell Building Blocks==
What major classes of molecules are found within cells?
===Lipids===
The term is more-specifically used to refer to fatty-acids and their derivatives (including tri-, di-, and mono-glycerides and phospholipids) as well as other fat-soluble sterol-containing metabolites such as cholesterol. Lipids serve many functions in living organisms including energy storage, serve as structural components of cell membranes, and constitute important signaling molecules. Although the term lipid is sometimes used as a synonym for fat, the latter is in fact a subgroup of lipids called triglycerides and should not be confused with the term fatty acid.
===Carbohydrates===
Carbohydrate molecules consist of carbon, hydrogen, and oxygen. They have a general formula C<sub>n</sub>(H<sub>2</sub>O)<sub>n</sub>. There are several sub-families based on molecular size.
Carbohydrates are chemical compounds that contain oxygen, hydrogen, and carbon atoms, and no other elements. They consist of monosaccharide sugars of varying chain lengths.
Certain carbohydrates are an important storage and transport form of energy in most organisms, including plants and animals. Carbohydrates are classified by their number of sugar units: monosaccharides (such as glucose and fructose), disaccharides (such as sucrose and lactose), oligosaccharides, and polysaccharides (such as starch, glycogen, and cellulose).
The simplest carbohydrates are monosaccharides, which are small straight-chain aldehydes and ketones with many hydroxyl groups added, usually one on each carbon except the functional group. Other carbohydrates are composed of monosaccharide units and break down under hydrolysis. These may be classified as disaccharides, oligosaccharides, or polysaccharides, depending on whether they have two, several, or many monosaccharide units.
[[Image:Protein-structure.png|right]]
===Proteins===
All proteins contain carbon, hydrogen, oxygen and nitrogen. Some also contain phosphorus and sulfur. The building blocks of proteins are amino acids. There are 20 different kinds of amino acids used by the human body. They unite by peptide bonds to form long molecules called polypeptides. Polypeptides are assembled into proteins. Proteins have four levels of structure
*'''Primary'''
Primary structure is the sequence of amino acids bonded in the polypeptide.
*'''Secondary'''
The secondary structure is formed by hydrogen bonds between amino acids. The polypeptide can coil into a helix or form a pleated sheet.
*'''Tertiary'''
The tertiary structure refers to the three-dimensional folding of the helix or pleated sheet.
*'''Quaternary'''
The quaternary structure refers to the spatial relationship among the polypeptide in the protein.
*'''Hexagonary'''
The hexagonary structure refers to the carpal relationship among the bipeptide in the person.
===Enzymes===
A biological molecule that catalyzes a chemical reaction. Enzymes are essential for life because most chemical reactions in living cells would occur too slowly or would lead to different products without enzymes. Most enzymes are proteins and the word "enzyme" is often used to mean a protein enzyme. Some RNA molecules also have a catalytic activity, and to differentiate them from protein enzymes, they are referred to as RNA enzymes or ribozymes.
{{Human Physiology/ReviewQuestions}}
==Glossary==
'''Active Transport''': the movement of solutes against a gradient and requires the expenditure of energy
'''Adenosine Triphosphate (ATP):''' a cell’s source of energy
'''Bulk Flow:''' the collective movement of substances in the same direction in response to a force
'''Cells:''' the microscopic fundamental unit that makes up all living things
'''Cell Membrane:''' boundary of the cell, sometimes called the plasma membrane
'''Cytoplasm:''' a water-like substance that fills cells. The cytoplasm consists of cytosol and the cellular organelles, except the cell nucleus. The cytosol is made up of water, salts, organic molecules and many enzymes that catalyze reactions. The cytoplasm holds all of the cellular organelles outside of the nucleus, maintains the shape and consistency of the cell, and serves as a storage place for chemical substances.
'''Cytoskeleton:''' made of threadlike proteins, helps cells maintain their shape and allows cells and their contents to move
'''Dialysis:''' the diffusion of solutes across a selectively permeable membrane. Most commonly heard of when a patient has had renal failure. In medicine, dialysis is a type of renal replacement therapy which is used to provide an artificial replacement for lost kidney function due to renal failure. It is a life support treatment and does not treat any kidney diseases.
'''Endocrine cells:''' similar to exocrine cells, but secrete their products directly into the bloodstream instead of through a duct
'''Endocytosis:''' the capture of a substance outside the cell when the plasma membrane merges to engulf it
'''Endoplasmic Reticulum:''' organelle that play an important role in making proteins and shuttling cellular products; also involved in metabolisms of fats, and the production of various materials
'''Epithelial Cells:''' cells that aid in secretion, absorption, protection, trans-cellular transport, sensation detection, and selective permeability
'''Exocrine Cells:''' cells that secrete products through ducts, such as mucus, sweat, or digestive enzymes
'''Exocytosis:''' the process of vesicles fusing with the plasma membrane and releasing their contents to the outside of the cell
'''Facilitated Diffusion:''' the diffusion of solutes through channel proteins in the plasma membrane
'''Golgi Apparatus:''' "packages" cellular products in sacs called vesicles so that the products can cross the cell membrane and exit the cell
'''Glycolysis:''' process in which sugars (glucose) are converted to acid
'''Lysosomes:''' sac-like compartments that contain a number of powerful degradative enzymes
'''Microfilaments:''' provide mechanical support for the cell, determine the cell shape, and in some cases enable cell movements
'''Microtubules:''' function as the framework along which organelles and vesicles move within a cell
'''Mitochondria:''' the organelles that function as the cell "powerhouse", generating ATP
'''Nucleus:''' controls the cell; houses the genetic material
'''Organelles:''' bodies embedded in the cytoplasm that serve to physically separate the various metabolic activities that occur within cells
'''Osmosis:''' the diffusion of water molecules across a selectively permeable membrane from an area of high solute concentration to an area of low solute concentration.
'''Passive Transport:''' the movement of substances down a concentration gradient and does not require energy use
'''Peroxisomes:''' organelles in which oxygen is used to oxidize substances, breaking down lipids and detoxifying certain chemicals
'''Phagocytosis:''' a form of endocytosis wherein large particles are enveloped by the cell membrane of a (usually larger) cell and internalized to form a phagosome, or "food vacuole." In animals, phagocytosis is performed by specialized cells called phagocytes, which serve to remove foreign bodies and thus fight infection. In vertebrates, these include larger macrophages and smaller granulocytes, types of blood cells. Bacteria, dead tissue cells, and small mineral particles are all examples of objects that may be phagocytosed.
'''Pinocytosis:''' also called cellular drinking, is a form of endocytosis, a process in which small particles are taken in by a cell by splitting into smaller particles. The particles then form small vesicles which subsequently fuse with lysosomes to hydrolyze, or to break down, the particles. This process requires adenosine triphosphate (ATP).
'''Receptor-mediated Endocytosis:''' occurs when specific molecules in the fluid surrounding the cell bind to specialized receptors in the plasma membrane
'''Red Blood Cells (erythrocytes):''' cells that collect oxygen in the lungs and deliver it through the blood to the body tissues
'''Ribosomes:''' play an active role in the complex process of protein synthesis, where they serve as the structures that facilitate the joining of amino acids
'''Simple Diffusion:''' the net movement of substances from an area of higher concentration to an area of lower concentration
'''Vacuoles:''' spaces in the cytoplasm that sometimes serve to carry materials to the cell membrane for discharge to the outside of the cell
'''White Blood Cells (leukocytes):''' produced in the bone marrow and help the body to fight infectious disease and foreign objects in the immune system
dnopz3zhd3m2o63kfo6dp0d40xgu2dm
LaTeX/Export To Other Formats
0
108307
4669617
4666366
2026-09-10T17:43:01Z
WereSpielChequers
248949
typo
4669617
wikitext
text/x-wiki
Strictly speaking, LaTeX source can be used to directly generate two formats:
* DVI using <code>latex</code>, the first one to be supported;
* PDF using {{LaTeX/LaTeX|code=pdflatex<!---->}}, more recent.
Using other software freely available on Internet, you can easily convert DVI and PDF to other document formats. In particular, you can obtain the PostScript version using software which is included in your LaTeX distribution. Some LaTeX IDE will give you the possibility to generate the PostScript version directly (even if it uses internally a DVI mid-step, e.g. LaTeX → DVI → PS). It is also possible to create PDF from DVI and vice versa. It doesn't seem logical to create a file with two steps when you can create it straight away, but some users might need it because, as you remember from the first chapters, the format you can generate depends upon the formats of the images you want to include (EPS for DVI, PNG and JPG for PDF). Here you will find sections about different formats with description about how to get it.
Other formats can be produced, such as RTF (which can be used in Microsoft Word) and HTML. However, these documents are produced from software that parses and interprets the LaTeX files, and do not implement all the features available for the primary DVI and PDF outputs. Nonetheless, they do work, and can be crucial tools for collaboration with colleagues who do not edit documents with LaTeX.
==Tools installation==
This chapter features a lot of third-party tools; most of them are installed independently of your TeX distribution.
Some tools are Unix-specific (*BSD, GNU/Linux and Mac OS X), but it may be possible to make them work on Windows. If you have the choice, it is often easier with Unix systems for command line tools.
Some tools may already be installed. For instance, you can check if dvipng is installed and ready to use (Unix only):
type dvipng
Most of these tools are installable using your package manager or portage tree (Unix only).
==Preview mode==
This section describes how to generate a screenshot of a LaTeX page or of a specific part of the page using the LaTeX package {{LaTeX/Package|preview}}. Screenshots are useful, for example, if you want to include a LaTeX generated formula on a presentation using your favorite slideware like Powerpoint, Keynote or LibreOffice Impress. First, start by making sure you have {{LaTeX/Package|preview}}. See [[LaTeX/Installing Extra Packages|Installing Extra Packages]].
Say you want to take a screenshot of
:<math>
\pi = \sqrt{12}\sum^\infty_{k=0} \frac{(-3)^{-k}}{2k+1}.
</math>
Write this formula in the {{LaTeX/Environment|preview}} environment:
{{LaTeX/Usage|code=
\documentclass{article}
\usepackage[active]{preview}
\begin{document}
\begin{preview}
\[
\pi = \sqrt{12}\sum^\infty_{k=0} \frac{ (-3)^{-k} }{ 2k+1 }
\]
\end{preview}
\end{document}
}}
Note the {{LaTeX/Parameter|active}} option in the package declaration and the {{LaTeX/Environment|preview}} environment around the equation's code. Without any of these two, you won't get any output.
This package is also very useful to export specific parts to other format, or to produce graphics (''e.g.'' using [[LaTeX/PGF/TikZ|PGF/TikZ]]) and then including them in other documents. You can also automate the previewing of specific environments:
{{LaTeX/Usage|code=
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{lstlisting}
\setlength{\PreviewBorder}{10pt}%
% ...
\begin{lstlisting}
int main()
{
/* ... */
}
\end{lstlisting}
}}
This will produce a PDF containing only the listing content, the ''page'' layout will depend on the shape of the source code.
==Convert to [[w:PDF|PDF]]==
=== Directly ===
pdflatex my_file
=== DVI to PDF===
<pre>
dvipdfm my_file.dvi
</pre>
will create <code>my_file.pdf</code>. Another way is to pass through PS generation:
<pre>
dvi2ps myfile.dvi
ps2pdf myfile.ps
</pre>
you will get also a file called ''my_file.ps'' that you can delete.
===Merging PDF===
If you have created different PDF documents and you want to merge them into one single PDF file you can use the following command-line command. You need to have Ghostscript installed:
====Using Windows====
gswin32 -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=Merged.pdf -dBATCH 1.pdf 2.pdf 3.pdf
====Using Linux====
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=Merged.pdf -dBATCH 1.pdf 2.pdf 3.pdf
Alternatively, [http://pdfshuffler.sourceforge.net/ PDF-Shuffler] is a small python-gtk application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface. This program may be available in your Linux distribution's repository.
Another option to check out is [http://www.accesspdf.com/ pdftk] (or PDF toolkit), which is a command-line tool that can manipulate PDFs in many ways. To merge one or more files, use:
pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
====Using pdfLaTeX====
''Note:'' If you are merging external PDF documents into a LaTeX document which is compiled with <code>pdflatex</code>, a much simpler option is to use the {{LaTeX/Package|pdfpages}} package, ''e.g.'':
{{LaTeX/Usage|code=
\usepackage{pdfpages}
...
\includepdf[pages=-]{Document1.pdf}
\includepdf[pages=-]{Document2.pdf}
...
}}
Three simple [[wikipedia:Shell (computing)|shell]] scripts using the {{LaTeX/Package|pdfpages}} package are provided in the [http://www2.warwick.ac.uk/fac/sci/statistics/staff/academic/firth/software/pdfjam pdfjam bundle] by D. Firth. They include options to merge several pdf files (pdfjoin), put several pages in one physical sheet (pdfnup) and rotate pages (pdf90).
See also [[LaTeX/Modular Documents#Inserting PDF files|Modular Documents]]
===XeTeX===
You can also use XeTeX (or, more precisely, XeLaTeX), which works in the same way as <code>pdflatex</code>: it creates a PDF file directly from LaTeX source. One advantage of XeTeX over standard LaTeX is support for Unicode and modern typographic technologies such as TrueType/OpenType fonts. See [[w:XeTeX|its Wikipedia entry]] for more details.
Customization of PDF output in XeTeX (setting document title, author, keywords etc.) is done using the configuration of [[LaTeX/Hyperlinks#Customization|hyperref]] package.
== Convert to [[w:PostScript|PostScript]] ==
;from PDF:
<pre>
pdf2ps my_file.pdf
</pre>
;from DVI:
<pre>
dvi2ps my_file.dvi
</pre>
== Convert to [[w:Rich Text Format|RTF]] ==
LaTeX can be converted into an RTF file, which in turn can be opened by a word processor such as [[w:LibreOffice Writer|LibreOffice Writer]] or [[w:Microsoft Word|Microsoft Word]]. This conversion is done through [https://github.com/latex2rtf/latex2rtf latex2rtf], which may run on any computer platform, however is only actively supported on Windows, Linux and BSD, with the last mac update being from 2001 (a recent version for OSX is available via MacPorts). The program operates by reading the LaTeX source, and mimicking the behaviour of the LaTeX program. <code>latex2rtf</code> supports most of the standard implementations of LaTeX, such as standard formatting, some math typesetting, inclusion of EPS, PNG or JPG graphics, and tables. As well, it has some limited support for packages, such as varioref, and natbib. However, many other packages are not supported.
<code>latex2rtf</code> is simple to use. The Windows version has a GUI (<code>l2rshell.exe</code>), which is straightforward to use. The command-line version is offered for all platforms, and can be used on an example <code>mypaper.tex</code> file:
latex mypaper
bibtex mypaper # if you use bibtex
latex2rtf mypaper
Both <code>latex</code> and (if needed) <code>bibtex</code> commands need to be run ''before'' <code>latex2rtf</code>, because the <code>.aux</code> and <code>.bbl</code> files are needed to produce the proper output. The result of this conversion will create <code>myfile.rtf</code>, which you may open in many word processors such as Microsoft Word or LibreOffice.
== Convert to HTML ==
There are many converters to HTML. Some of them use an intermediate file which then will be converted to the destination format.
;[http://hevea.inria.fr HEVEA]:
hevea mylatexfile
;latex2html:
latex2html -html_version 4.0,latin1,unicode -split 1 -nonnavigation -noinfo -title "MyDocument" MyDocument.tex
;[[w:LaTeXML|LaTeXML]]:
latexmlc paper.tex --destination=paper.html
;[https://github.com/coolwanglu/pdf2htmlEX pdf2htmlEX]:
pdf2htmlEX [options] <input.pdf> [<output.html>]
pdf2htmlEX can convert PDF to HTML without losing text or format. It is designed as a general PDF to HTML converter, not only restricted to the PDF generated by LaTeX source. LaTeX users can compile the LaTeX source code to PDF, and then convert the PDF to HTML via pdf2htmlEX. Some introductions of pdf2htmlEX can be found on its own [https://github.com/coolwanglu/pdf2htmlEX/wiki wiki page]. More technical details can be found on the paper published on TUGboat: ''Online publishing via pdf2htmlEX'' [http://coolwanglu.github.io/pdf2htmlEX/doc/tb108wang.html HTML] / [http://coolwanglu.github.io/pdf2htmlEX/doc/tb108wang.pdf PDF]. The Figure 3 of the paper gives different work-flows of publishing HTML online.
;TeX4ht
[http://tug.org/tex4ht/ TeX4ht] has many options and possible configurations, but for a basic conversion,
htlatex myfile.tex
will usually result in a reasonable HTML approximation. An introduction by the original author was published in TUGboat [http://tug.org/TUGboat/tb25-1/gurari.pdf].
;[http://freecode.com/projects/bibtex2html bibtex2html]:
For exporting the BibTeX file only.
bibtex2html mybibtexfile
==Convert to image formats==
It is sometimes useful to convert LaTeX output to image formats for use in systems that do not support DVI nor PDF files, such as Wikipedia.
There are two families of graphics:
* Vector graphics can be scaled to any size, thus do not suffer from quality loss. [[w:Scalable Vector Graphics|SVG]] is a vector format.
* Raster graphics define every pixel explicitly. [[w:PNG|PNG]] is a raster format.
So vector graphics are usually preferred. There is still some cases where raster graphics are used:
* The target system does not handle vector graphics, only raster graphics are supported.
* SVG can not embed fonts. So either the font will be rendered using a local .ttf or .otf font (which will mostly change the output), or all characters must be turned to vector graphics. This last method makes the SVG big and slow. If the input LaTeX file contains a lot of text which formatting must be preserved, SVG is not that great.
So SVG is great for drawings and a small amount of text.
JPG is a well known raster formats, however it is usually not as good as PNG for text.
In some cases it may be sufficient to simply copy a region of a PDF (or PS) file using the tools available in a PDF viewer (for example using LaTeX to typeset a formula for pasting into a presentation). This however will not generally have sufficient resolution for whole pages or large areas.
=== Multiple formats ===
;pdftocairo
There is <code>pdftocairo</code> featured in the poppler toolset.
pdftocairo -svg latexdoc.pdf output.svg
<code>pdftocairo</code> also supports various raster graphic formats.
=== Vector graphics ===
;pdf2svg
Direct conversion from PDF to SVG can be done using the command line tool [http://www.cityinthesky.co.uk/opensource/pdf2svg/ pdf2svg].
pdf2svg file.pdf file.svg
;ps2svg
Alternatively DVI or PDF can be converted to PS as described before, then the bash script [http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Electronics/Ps2svg.sh ps2svg.sh] can be used (as all the software used by this script is multiplatform, this is also possible in Windows, a step-by-step guide could be written).
;dvisvgm
One can also use [https://dvisvgm.de/ dvisvgm], an open source utility that converts from DVI to SVG.
dvisvgm -n file.dvi
;Inkscape
Inkscape is able to convert to SVG, PDF, EPS, and other vector graphic formats.
inkscape --export-area-drawing --export-ps=OUTPUT INPUT
inkscape --export-area-page --export-plain-svg=OUTPUT INPUT
=== Raster graphics ===
* '''JPEG'''
** Run ghostscript on the PostScript file created by pdf2ps as follows:<syntaxhighlight lang="bash">
echo "quit" | gs -sDEVICE=jpeg -sOutputFile=document.jpg -r300 document.ps
</syntaxhighlight>MacOS: macTex distribution come with handy cli for "printing":<syntaxhighlight lang="bash">
pdftoppm yourpdf.pdf -progress -jpeg yourpdf.jpg
</syntaxhighlight>pdftoppm is flexible on the manipulation - you can provide quality, dimention etc. which fits most needs of typical user. It can also print PDF into PNG and PPM files, read more in the manual for the utility. It is best on non interactive batch jobs.
* '''GIMP'''
**Open your file with [[GIMP]]. It will ask you which page you want to convert, whether you want to use anti-aliasing (choose ''strong'' if you want to get something similar to what you see on the screen). Try different resolutions to fit your needs, but 100 dpi should be enough. Once you have the image within GIMP, you can post-process it as you like and save it to any format supported by GIMP, as PNG for example.
* '''dvipng'''
** A method for DVI files is [http://savannah.nongnu.org/projects/dvipng/ dvipng]. Usage is the same as <code>dvipdfm</code>. Run <code>latex</code> as usual to generate the dvi file. Now, we want an X font size formula, where X is measure in pixels. You need to convert this, to dots per inch (dpi). The formula is: <code><dpi> = <font_px>*72.27/10</code>. If you want, for instance, X = 32, then the size in dpi corresponds to 231.26. This value will be passed to <code>dvipng</code> using the flag <code>-D</code>. To generate the desired png file run the command as follows:
<syntaxhighlight lang="bash">dvipng -T tight -D 231.26 -o foo.png foo.dvi</syntaxhighlight>
The flag <code>-T</code> sets the size of the image. The option <code>tight</code> will only include all ink put on the page. The option <code>-o</code> sends the output to the file name <code>foo.png</code>.
* '''ImageMagick'''
** The <code>convert</code> command from the [https://imagemagick.org/script/convert.php/ ImageMagick] suite can convert both DVI and PDF files to PNG.
convert input.pdf output.png
* '''optipng'''
** You can optimize the resulting image using [http://optipng.sourceforge.net/ optipng] so that it will take up less space.
==Convert to plain text==
If you are thinking of converting to plain text for spell-checking or to count words, there may be an easier way — read [[LaTeX/Tips and Tricks#Spell-checking and Word Counting|Tips and Tricks]] first. Following are available tools
* [detex] - comes with latex distribution
Most LaTeX distributions come with <code>detex</code> program, which strips LaTeX commands. It can handle multi-file projects, so all you need is to give one command:
detex yourfile
''(note the omission of .tex extension)''. Outputs result to the standard output. Redirect output to file using
detex yourfile > yourfile.txt
Output of <code>detex</code> can contain undesired elements, the tool does not claims perfect conversion - make sure you use latest version [https://github.com/pkubowicz/opendetex opendetex], or use HTML conversion first and then copy text from your browser.
* [catdvi]
If you want to keep the formatting, you can use a ''DVI-to-plain text'' converter, like <code>catdvi</code>. Example:
catdvi yourfile.dvi | fmt -u
The use of ''fmt -u'' (available on most Unices) will remove the justification.
<noinclude>
{{LaTeX/Bottom|Collaborative Writing of LaTeX Documents|FAQ}}
</noinclude>
[[sr:LaTeX/Отпремање у друге формате]]
ivu103k8sphl0041l69v97c7d2ngd6k
Wikibooks:Reading room/General
4
112405
4669604
4669504
2026-09-10T14:45:19Z
Codename Noreste
3441010
/* How Do I Get My Book On A Shelf? */ reply: Which shelf are you referring? (-) ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4669604
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{Shortcut|WB:CHAT|WB:RR/G|WB:GENERAL}} {{TOC left|limit=3}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Archives/%(year)d/%(monthname)s
|algo = old(60d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
|key = 7a0ac23cf8049e4d9ff70cabb5649d1a
}}
Welcome to the '''General reading room'''. On this page, Wikibookians are free to talk about the Wikibooks project in general. For proposals for improving Wikibooks, see the [[../Proposals/]] reading room.
{{clear}}
[[Category:Reading room]]
== July 2026 Wikimedia Café meetups regarding Wikimedia governance and options for reform ==
<div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)">
<div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div>
Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in July. Both sessions will focus on Wikimedia governance, including possible follow-ups to the [https://meta.wikimedia.org/wiki/Movement_Charter Movement Charter] and options for reform. Participants may attend either or both Café sessions.
This month, to deconflict the Café meetups from Wikimania, the meetups will be held one day later than usual.
#'''26 July 2026 15:00 UTC''' ([https://zonestamp.toolforge.org/1785078000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe
#'''27 July 2026 03:00 UTC''' ([https://zonestamp.toolforge.org/1785121200 timestamp converter]), at a time friendly to Asia and the Pacific
Please see the Café page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]!
<br />
[[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div>
<span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">↠Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 03:53, 13 July 2026 (UTC)
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}} [[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:24, 24 July 2026 (UTC)</bdi>
<!-- Message sent by User:DreamRimmer@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Call for administrators ==
Any experienced editor who has a good understanding of Wikibooks' policies should consider applying for administrator permissions at [[Wikibooks:Requests for permissions]]. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 22:10, 5 August 2026 (UTC)
== August 2026 Wikimedia Café meetups regarding [https://meta.wikimedia.org/wiki/Next_25 Next 25] ==
<div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)">
<div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div>
Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in August. Both sessions will focus on [https://meta.wikimedia.org/wiki/Next_25 the Next 25 initiative], including [https://meta.wikimedia.org/wiki/Next_25/A_proposal_to_frame_Next_25 framing the initiative]. Participants may attend either or both Café sessions.
#'''29 August 2026 15:00 UTC''' ([https://zonestamp.toolforge.org/1788015600 timestamp converter]), at a time friendly to the Americas, Africa, and Europe
#'''30 August 2026 03:00 UTC''' ([https://zonestamp.toolforge.org/1788058800 timestamp converter]), at a time friendly to Asia and the Pacific
Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#Agenda._This_will_be_an_approximately_1_hour_Caf%C3%A9_session agenda details] and [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]!
To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here].
<br />
[[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div>
<span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 01:32, 17 August 2026 (UTC)
== Wikibooks project is not defined by goal ==
If it is for texbooks why is it called Wikibooks? It should be called Wikitextbooks! If it is for textbooks why does it contain cookbooks? For textbooks it's not supposed to have a [[Wikibooks:Featured books]]. [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 09:20, 1 September 2026 (UTC)
:It's "textbooks" broadly construed: guides, manuals, how-tos, etc. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:15, 1 September 2026 (UTC)
::So we should change "Wikibooks:Featured books" to "Wikibooks:Featured texts". [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:17, 1 September 2026 (UTC)
:::I disagree and even if I agreed, it would be priority #49,389. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:20, 1 September 2026 (UTC)
::::It's according to community consensus that says this website contains textbooks not books. [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:23, 1 September 2026 (UTC)
:::::"[[wb:WIW|Simply, Wikibooks is a collection of open-content textbooks.]]" [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:26, 1 September 2026 (UTC)
:Most textbooks are made by collaboration of some authors, co-authors and editors. Wikibooks help pages and guidelines remain silent when it comes to stages of writing a new texbooks. Even [[Using Wikibooks]] is not complete emough for enthusiasts. --[[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 18:13, 3 September 2026 (UTC)
== Wishlist 2027, invitation to share feedback ==
Hi, I’m [[m:User:SPerry-WMF|Sonja]] and I lead some of the [[mw:Contributors|teams]] at the Foundation who will be responsible for picking up wish work under the new wishlist process.
As you may know, the [[m:Community_Wishlist|Community Wishlist]] started out as an annual process through which Wikimedia contributors submit and vote on technical improvements they would like the Wikimedia Foundation to work on. The main goal of it is and has been to improve the editing experience by making changes and features the community asks for specifically.
In recent years, the process behind the wishlist has changed, and we’ve heard from many of you that it no longer meets many community members’ needs. So now, the Foundation is designing a new process with the community to improve how wishes are triaged, voted on, and prioritized in a way that is transparent, balanced across project families and language editions, and takes into account what the Foundation can deliver.
I would like to get community input specifically on these three stages of the Wishlist process:
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#triage|'''triage stage''']], meaning how wishes are fleshed out, organized and filtered prior to voting
** We recommend to have a working group, including volunteers from various wikis and Wikimedia Foundation staff to work through this together
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#vote|'''voting stage''']], including who may vote and how votes are structured
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#postvote|'''post-vote stage''']], including how to bring equity into what work is prioritized
** One way to do this is to rank wishes within 3 categories: Large Wikipedias or covering all wikis, small and medium-sized Wikipedias, and '''sister projects''', so that top-voted wishes from smaller projects also get attention
This message is an abstract of the full proposed process. As you [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027|read the proposed ideas on Meta]] (available in your language), please speak up about whether you think this will work well or if there are ways to make it stronger.
Regarding the timeline, this consultation is open for two weeks. You can post your feedback on Meta (in your preferred language) or in response below.
For this year’s cycle, [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#timeline|we plan]] to have the wish submission period in late October/early November and the triage process completed by late November. To respect the end-of-year holiday season, voting would happen in early to mid January. This first voting cycle is meant as a first step to try out a new process, and there will be more opportunities to provide feedback along the way, so that we can figure out the best process for future years together.
[[oldwikisource:M:User:SPerry-WMF|SPerry-WMF]], delivered by [[User:Trizek (WMF)|Trizek (WMF)]] ([[User talk:Trizek (WMF)|discuss]] • [[Special:Contributions/Trizek (WMF)|contribs]]) 13:52, 1 September 2026 (UTC)
== How Do I Get My Book On A Shelf? ==
Help, I don't know how shelves work. I don't know how to put my book on a shelf. Can anyone help?
The book is called''' Art And AI''' [[User:3MMPEYTON|3MMPEYTON]] ([[User talk:3MMPEYTON|discuss]] • [[Special:Contributions/3MMPEYTON|contribs]]) 23:00, 8 September 2026 (UTC)
: Which shelf are you referring? [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:45, 10 September 2026 (UTC)
32cks30doqdd3kmpd3m60ljw1b8y0dv
4669644
4669604
2026-09-11T08:10:39Z
ArchiverBot
1227662
Bot: Archiving 1 thread (older than 60 days) to [[Wikibooks:Reading room/Archives/2026/July]]
4669644
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{Shortcut|WB:CHAT|WB:RR/G|WB:GENERAL}} {{TOC left|limit=3}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Archives/%(year)d/%(monthname)s
|algo = old(60d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
|key = 7a0ac23cf8049e4d9ff70cabb5649d1a
}}
Welcome to the '''General reading room'''. On this page, Wikibookians are free to talk about the Wikibooks project in general. For proposals for improving Wikibooks, see the [[../Proposals/]] reading room.
{{clear}}
[[Category:Reading room]]
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}} [[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:24, 24 July 2026 (UTC)</bdi>
<!-- Message sent by User:DreamRimmer@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Call for administrators ==
Any experienced editor who has a good understanding of Wikibooks' policies should consider applying for administrator permissions at [[Wikibooks:Requests for permissions]]. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 22:10, 5 August 2026 (UTC)
== August 2026 Wikimedia Café meetups regarding [https://meta.wikimedia.org/wiki/Next_25 Next 25] ==
<div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)">
<div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div>
Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in August. Both sessions will focus on [https://meta.wikimedia.org/wiki/Next_25 the Next 25 initiative], including [https://meta.wikimedia.org/wiki/Next_25/A_proposal_to_frame_Next_25 framing the initiative]. Participants may attend either or both Café sessions.
#'''29 August 2026 15:00 UTC''' ([https://zonestamp.toolforge.org/1788015600 timestamp converter]), at a time friendly to the Americas, Africa, and Europe
#'''30 August 2026 03:00 UTC''' ([https://zonestamp.toolforge.org/1788058800 timestamp converter]), at a time friendly to Asia and the Pacific
Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#Agenda._This_will_be_an_approximately_1_hour_Caf%C3%A9_session agenda details] and [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]!
To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here].
<br />
[[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div>
<span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 01:32, 17 August 2026 (UTC)
== Wikibooks project is not defined by goal ==
If it is for texbooks why is it called Wikibooks? It should be called Wikitextbooks! If it is for textbooks why does it contain cookbooks? For textbooks it's not supposed to have a [[Wikibooks:Featured books]]. [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 09:20, 1 September 2026 (UTC)
:It's "textbooks" broadly construed: guides, manuals, how-tos, etc. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:15, 1 September 2026 (UTC)
::So we should change "Wikibooks:Featured books" to "Wikibooks:Featured texts". [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:17, 1 September 2026 (UTC)
:::I disagree and even if I agreed, it would be priority #49,389. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:20, 1 September 2026 (UTC)
::::It's according to community consensus that says this website contains textbooks not books. [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:23, 1 September 2026 (UTC)
:::::"[[wb:WIW|Simply, Wikibooks is a collection of open-content textbooks.]]" [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:26, 1 September 2026 (UTC)
:Most textbooks are made by collaboration of some authors, co-authors and editors. Wikibooks help pages and guidelines remain silent when it comes to stages of writing a new texbooks. Even [[Using Wikibooks]] is not complete emough for enthusiasts. --[[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 18:13, 3 September 2026 (UTC)
== Wishlist 2027, invitation to share feedback ==
Hi, I’m [[m:User:SPerry-WMF|Sonja]] and I lead some of the [[mw:Contributors|teams]] at the Foundation who will be responsible for picking up wish work under the new wishlist process.
As you may know, the [[m:Community_Wishlist|Community Wishlist]] started out as an annual process through which Wikimedia contributors submit and vote on technical improvements they would like the Wikimedia Foundation to work on. The main goal of it is and has been to improve the editing experience by making changes and features the community asks for specifically.
In recent years, the process behind the wishlist has changed, and we’ve heard from many of you that it no longer meets many community members’ needs. So now, the Foundation is designing a new process with the community to improve how wishes are triaged, voted on, and prioritized in a way that is transparent, balanced across project families and language editions, and takes into account what the Foundation can deliver.
I would like to get community input specifically on these three stages of the Wishlist process:
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#triage|'''triage stage''']], meaning how wishes are fleshed out, organized and filtered prior to voting
** We recommend to have a working group, including volunteers from various wikis and Wikimedia Foundation staff to work through this together
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#vote|'''voting stage''']], including who may vote and how votes are structured
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#postvote|'''post-vote stage''']], including how to bring equity into what work is prioritized
** One way to do this is to rank wishes within 3 categories: Large Wikipedias or covering all wikis, small and medium-sized Wikipedias, and '''sister projects''', so that top-voted wishes from smaller projects also get attention
This message is an abstract of the full proposed process. As you [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027|read the proposed ideas on Meta]] (available in your language), please speak up about whether you think this will work well or if there are ways to make it stronger.
Regarding the timeline, this consultation is open for two weeks. You can post your feedback on Meta (in your preferred language) or in response below.
For this year’s cycle, [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#timeline|we plan]] to have the wish submission period in late October/early November and the triage process completed by late November. To respect the end-of-year holiday season, voting would happen in early to mid January. This first voting cycle is meant as a first step to try out a new process, and there will be more opportunities to provide feedback along the way, so that we can figure out the best process for future years together.
[[oldwikisource:M:User:SPerry-WMF|SPerry-WMF]], delivered by [[User:Trizek (WMF)|Trizek (WMF)]] ([[User talk:Trizek (WMF)|discuss]] • [[Special:Contributions/Trizek (WMF)|contribs]]) 13:52, 1 September 2026 (UTC)
== How Do I Get My Book On A Shelf? ==
Help, I don't know how shelves work. I don't know how to put my book on a shelf. Can anyone help?
The book is called''' Art And AI''' [[User:3MMPEYTON|3MMPEYTON]] ([[User talk:3MMPEYTON|discuss]] • [[Special:Contributions/3MMPEYTON|contribs]]) 23:00, 8 September 2026 (UTC)
: Which shelf are you referring? [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:45, 10 September 2026 (UTC)
ig5ckpnu92vcy901urv0s1r7klque0w
Wikibooks:Reading room/Technical Assistance
4
112409
4669605
4669155
2026-09-10T14:47:06Z
Codename Noreste
3441010
/* Examples of the navigation templates. */ reply ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4669605
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{Shortcut|WB:TECH}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Archives/%(year)d/%(monthname)s
|algo = old(50d)
|counter = 1
|minthreadstoarchive = 1
|key = bf05448a5bbfa2d2a4efbdad870e68a4
|minthreadsleft = 1
}}
Welcome to the '''Technical Assistance reading room'''. Get assistance on questions related to [[w:MediaWiki|MediaWiki]] markup, CSS, JavaScript, and such as they relate to Wikibooks. '''This is not a general-purpose technical support room'''.
To submit a ''bug notice or feature request'' for the MediaWiki software, visit [[phabricator:|Phabricator]].
To get more information about the ''MediaWiki software'', or to download your own copy, visit [[mw:|MediaWiki]]
There are also two IRC channels for technical help: {{Channel|mediawiki}} for issues about the software, and {{channel|mediawiki-core}} for [[m:WMF|WMF]] server or configuration issues.
{{clear}}
[[Category:Reading room]]
== Examples of the navigation templates. ==
There are several navigation templates. I've used <nowiki>{{Navigation ...}}</nowiki> in [[Oberon|Oberon Computing]]. Someone please point to a few other books where a navigation template is used at the top of pages.
Searching for a string in rendered pages is easy. Can source pages be searched? How?
Thanks, ... [[User:PeterEasthope|PeterEasthope]] ([[User talk:PeterEasthope|discuss]] • [[Special:Contributions/PeterEasthope|contribs]]) 15:44, 6 September 2026 (UTC)
: There is <span class="plainlinks">[https://en.wikibooks.org/wiki/Special:WhatLinksHere?target=Template%3ANavigation Special:WhatLinksHere]</span> for that template. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:47, 10 September 2026 (UTC)
l4rjweny135hyauiccrpcnlx8vl6vzj
User talk:Tyoyafud
3
128758
4669612
4662615
2026-09-10T15:28:08Z
Tyoyafud
6233
/* 10,000+ words */ Reply
4669612
wikitext
text/x-wiki
Welcome, {{PAGENAME}}!
{| style="background:white; border:1px solid #abd5f5;; padding:0px; border-spacing:0px;"
! style="background:#d0e5f5;" | [[Wikibooks:Welcome, newcomers|Getting started]] with Wikibooks
|-
| style="padding:5px;" |
* Wikibooks is a collection of open-source textbooks. Find out [[WB:WIW|what this means]].
* To sign your name (on talk pages), use four tildes, like this: ~~~~
* For help in using the wiki, see the [[Help:Editing|editing guide]].
* Explore, [[Wikibooks:Be bold|be bold]], and have fun!
|}
Come introduce yourself at the [[WB:SLN|new users]] page. If you have any questions, you can ask there or contact me personally. [[User:Mattb112885|Mattb112885]] <small> ([[User talk:Mattb112885|talk to me]]) </small> 23:24, 19 July 2007 (UTC)
==Reviewer==
{{tmbox|image=[[File:Wikibooks award.svg|50px]]|imageright = [[Image:Nuvola apps bookcase.svg|40px]]|text=<big>'''You have been automatically promoted to <u>''Reviewer!''</u>'''</big><br/>
Your recent contributions mean that you have met the requirements to be automatically promoted to [[Wikibooks:Reviewer|Reviewer]]. If you have any questions about using the review functionality please ask in the [[Wikibooks:Reading room|Reading Room]]. Thanks and Congratulations! [[User:QuiteUnusual|<span style="color:#E66C2C">'''QU'''</span>]] <sup>[[User talk:QuiteUnusual|<span style="color:#306754">TalkQu</span>]]</sup> 17:05, 18 April 2013 (UTC)}}
== Share your experience and feedback as a Wikimedian in this global survey ==
<div class="mw-parser-output">
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
Hello! The Wikimedia Foundation is asking for your feedback in a survey. We want to know how well we are supporting your work on and off wiki, and how we can change or improve things in the future. The opinions you share will directly affect the current and future work of the Wikimedia Foundation. You have been randomly selected to take this survey as we would like to hear from your Wikimedia community. The survey is available in various languages and will take between 20 and 40 minutes.
<big>'''[https://wikimedia.qualtrics.com/jfe/form/SV_5ABs6WwrDHzAeLr?aud=VAE&prj=ot&edc=4&prjedc=ot4 Take the survey now!]'''</big>
You can find more information about this survey [[m:Special:MyLanguage/Community_Engagement_Insights/About_CE_Insights|on the project page]] and see how your feedback helps the Wikimedia Foundation support editors like you. This survey is hosted by a third-party service and governed by this [[:foundation:Community_Engagement_Insights_2018_Survey_Privacy_Statement|privacy statement]] (in English). Please visit our [[m:Special:MyLanguage/Community_Engagement_Insights/Frequently_asked_questions|frequently asked questions page]] to find more information about this survey. If you need additional help, or if you wish to opt-out of future communications about this survey, send an email through the EmailUser feature to [[:m:Special:EmailUser/WMF Surveys|WMF Surveys]] to remove you from the list.
Thank you!
</div> <span class="mw-content-ltr" dir="ltr">[[m:User:WMF Surveys|WMF Surveys]]</span>, 18:36, 29 March 2018 (UTC)
</div>
<!-- Message sent by User:WMF Surveys@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Community_Engagement_Insights/MassMessages/Lists/2018/ot4&oldid=17881401 -->
== Reminder: Share your feedback in this Wikimedia survey ==
<div class="mw-parser-output">
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
Every response for this survey can help the Wikimedia Foundation improve your experience on the Wikimedia projects. So far, we have heard from just 29% of Wikimedia contributors. The survey is available in various languages and will take between 20 and 40 minutes to be completed. '''[https://wikimedia.qualtrics.com/jfe/form/SV_5ABs6WwrDHzAeLr?aud=VAE&prj=ot&edc=4&prjedc=ot4 Take the survey now.]'''
If you have already taken the survey, we are sorry you've received this reminder. We have design the survey to make it impossible to identify which users have taken the survey, so we have to send reminders to everyone.
If you wish to opt-out of the next reminder or any other survey, send an email through EmailUser feature to [[:m:Special:EmailUser/WMF Surveys|WMF Surveys]]. You can also send any questions you have to this user email. [[m:Community_Engagement_Insights/About_CE_Insights|Learn more about this survey on the project page.]] This survey is hosted by a third-party service and governed by this Wikimedia Foundation [[:foundation:Community_Engagement_Insights_2018_Survey_Privacy_Statement|privacy statement]]. Thanks!
</div> <span class="mw-content-ltr" dir="ltr">[[m:User:WMF Surveys|WMF Surveys]]</span>, 01:34, 13 April 2018 (UTC)
</div>
<!-- Message sent by User:WMF Surveys@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Community_Engagement_Insights/MassMessages/Lists/2018/ot4&oldid=17881401 -->
== Your feedback matters: Final reminder to take the global Wikimedia survey ==
<div class="mw-parser-output">
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
Hello! This is a final reminder that the Wikimedia Foundation survey will close on '''23 April, 2018 (07:00 UTC)'''. The survey is available in various languages and will take between 20 and 40 minutes. '''[https://wikimedia.qualtrics.com/jfe/form/SV_5ABs6WwrDHzAeLr?aud=VAE&prj=ot&edc=4&prjedc=ot4 Take the survey now.]'''
'''If you already took the survey - thank you! We will not bother you again.''' We have designed the survey to make it impossible to identify which users have taken the survey, so we have to send reminders to everyone. To opt-out of future surveys, send an email through EmailUser feature to [[:m:Special:EmailUser/WMF Surveys|WMF Surveys]]. You can also send any questions you have to this user email. [[m:Community_Engagement_Insights/About_CE_Insights|Learn more about this survey on the project page.]] This survey is hosted by a third-party service and governed by this Wikimedia Foundation [[:foundation:Community_Engagement_Insights_2018_Survey_Privacy_Statement|privacy statement]].
</div> <span class="mw-content-ltr" dir="ltr">[[m:User:WMF Surveys|WMF Surveys]]</span>, 00:43, 20 April 2018 (UTC)
</div>
<!-- Message sent by User:WMF Surveys@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Community_Engagement_Insights/MassMessages/Lists/2018/ot4&oldid=17952015 -->
== Community Insights Survey ==
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
'''Share your experience in this survey'''
Hi {{PAGENAME}},
The Wikimedia Foundation is asking for your feedback in a survey about your experience with {{SITENAME}} and Wikimedia. The purpose of this survey is to learn how well the Foundation is supporting your work on wiki and how we can change or improve things in the future. The opinions you share will directly affect the current and future work of the Wikimedia Foundation.
Please take 15 to 25 minutes to '''[https://wikimedia.qualtrics.com/jfe/form/SV_0pSrrkJAKVRXPpj?Target=CI2019List(other,act3) give your feedback through this survey]'''. It is available in various languages.
This survey is hosted by a third-party and [https://foundation.wikimedia.org/wiki/Community_Insights_2019_Survey_Privacy_Statement governed by this privacy statement] (in English).
Find [[m:Community Insights/Frequent questions|more information about this project]]. [mailto:surveys@wikimedia.org Email us] if you have any questions, or if you don't want to receive future messages about taking this survey.
Sincerely,
</div> [[User:RMaung (WMF)|RMaung (WMF)]] 14:31, 9 September 2019 (UTC)
<!-- Message sent by User:RMaung (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=CI2019List(other,act3)&oldid=19352826 -->
== Reminder: Community Insights Survey ==
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
'''Share your experience in this survey'''
Hi {{PAGENAME}},
A couple of weeks ago, we invited you to take the Community Insights Survey. It is the Wikimedia Foundation’s annual survey of our global communities. We want to learn how well we support your work on wiki. We are 10% towards our goal for participation. If you have not already taken the survey, you can help us reach our goal! '''Your voice matters to us.'''
Please take 15 to 25 minutes to '''[https://wikimedia.qualtrics.com/jfe/form/SV_0pSrrkJAKVRXPpj?Target=CI2019List(other,act3) give your feedback through this survey]'''. It is available in various languages.
This survey is hosted by a third-party and [https://foundation.wikimedia.org/wiki/Community_Insights_2019_Survey_Privacy_Statement governed by this privacy statement] (in English).
Find [[m:Community Insights/Frequent questions|more information about this project]]. [mailto:surveys@wikimedia.org Email us] if you have any questions, or if you don't want to receive future messages about taking this survey.
Sincerely,
</div> [[User:RMaung (WMF)|RMaung (WMF)]] 19:12, 20 September 2019 (UTC)
<!-- Message sent by User:RMaung (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=CI2019List(other,act3)&oldid=19397751 -->
== Reminder: Community Insights Survey ==
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
'''Share your experience in this survey'''
Hi {{PAGENAME}},
There are only a few weeks left to take the Community Insights Survey! We are 30% towards our goal for participation. If you have not already taken the survey, you can help us reach our goal!
With this poll, the Wikimedia Foundation gathers feedback on how well we support your work on wiki. It only takes 15-25 minutes to complete, and it has a direct impact on the support we provide.
Please take 15 to 25 minutes to '''[https://wikimedia.qualtrics.com/jfe/form/SV_0pSrrkJAKVRXPpj?Target=CI2019List(other,act3) give your feedback through this survey]'''. It is available in various languages.
This survey is hosted by a third-party and [https://foundation.wikimedia.org/wiki/Community_Insights_2019_Survey_Privacy_Statement governed by this privacy statement] (in English).
Find [[m:Community Insights/Frequent questions|more information about this project]]. [mailto:surveys@wikimedia.org Email us] if you have any questions, or if you don't want to receive future messages about taking this survey.
Sincerely,
</div> [[User:RMaung (WMF)|RMaung (WMF)]] 17:02, 4 October 2019 (UTC)
<!-- Message sent by User:RMaung (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=CI2019List(other,act3)&oldid=19430537 -->
== [[Mirad Version 2]] ==
Please respond to the question [[Talk:Mirad Version 2|on the book's talk page]]. The situation needs clarification. I pinged you there, but it seems the notification may have gotten misplaced. --[[User:Pi zero|Pi zero]] ([[User talk:Pi zero|discuss]] • [[Special:Contributions/Pi zero|contribs]]) 23:38, 21 June 2020 (UTC)
== Mirad ==
Hi, how are you. I have just found your article about Mirad and I think it is very interesting. Do you speak the language? --[[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 08:33, 20 July 2022 (UTC)
: Would it be possible for you to help me learn the language? --[[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 10:27, 22 July 2022 (UTC)
::Hi! I am trying to contact you, as you have stated in your User page (''If you are interested in Mirad, you can contact me on my discussion page and then we can exchange email addresses.''). I think I found you on LinkedIn and also sent you a message there. I have also sent you and email to Shoetack@... (which I think it is yours). However, I haven't received any answer neither here, nor on LinkedIn nor by email. I would like to learn Mirad and would like to ask for some pieces of advice. If you prefer not to be contacted please let me know. Kind regards [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 12:21, 1 August 2022 (UTC)
::: Hi, sorry to bother you again, I would like to ask you wheter [https://mirad.miraheze.org/wiki/Albanam this] and [https://mirad.miraheze.org/wiki/Mirad this] is correct? I have started a [https://mirad.miraheze.org/wiki/Main_Page wiki] in Mirad in order to practise the language while translating shorts texts. It would be great if you could help out there. --[[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 06:09, 2 August 2022 (UTC)
::::: The Czech Republic is now called ''Czechia'' and is translated as '''Cekyam''' in Mirad.
::::: When you want to say ''in Europe, in Paris, or in Czechia'', it is better to use the all-purpose locative preposition '''be''', such as '''be Europa'''....''in Europe''. The word '''yeb''' is an adverb meaning ''inside, in''. It takes a preposition like '''be'''....''at'', '''bi'''...''of'', or '''bu''' to make a prepositional phrase. For example:
::::::* '''Iyt se <u>yeb be</u> ha tam.'''....''She is <u>in/inside</u> the house.''
::::::* '''At peye <u>yeb bu</u> ha dyesnexam.'''....''I am going <u>into (=inside to)</u> the library.''
::::::* '''Yay yeyfe zoyper <u>yeb bi</u> ha om.'''....''We should come back <u>in from</u> the cold.''
::::: The preposition '''be''' is used for general locative and idiomatic situations:
::::::* '''be ha domep'''....''on the street''
::::::* '''be yaniv'''....''at a party''
::::::* '''be bak ay be bok'''....''in health and in sickness''
::::::* '''be abem bi ha tam'''....'' on top of the house''
::::::* '''be yibsinibar'''....''on television''
::::::* '''be 1983'''....''in 1983''
::::::* '''be Meur'''....''on Mars''
::::[[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 18:59, 17 August 2022 (UTC)
:::::{{ping|Caro de Segeda}}, you may be interested in the reply. -<span style="background:yellow;">[[User:Slava Ukraini Heroyam Slava 123|🇺🇦<span style="color:blue;">Слава🇺🇦Україні</span>🇺🇦<span style="color:blue;">Героям🇺🇦Слава🇺🇦</span>]]([[User talk:Slava Ukraini Heroyam Slava 123|talk]])🇺🇦</span> 18:05, 3 September 2022 (UTC)
::::::Thanks for telling me, somehow I haven't got any notification about @[[User:Tyoyafud|Tyoyafud]]'s reply.
::::::@[[User:Tyoyafud|Tyoyafud]] thanks for your answer, if you would like to add texts to the wiki, please feel free to do so. Unfortunately, now I am quite busy and I don't know when I will be able to keep learning Mirad or helping out on the wiki. All the best. [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 19:06, 3 September 2022 (UTC)
== Dundyes ==
Hay! Duhayen et se? I am writing just to inform you that these Asian countries don't have a translation on the dictionary: Azerbaijan, Bangladesh, Bhutan, East Timor, Kyrgyzstan, Maldives, Sri Lanka, Tajikistan, Turkmenistan, United Arab Emirates, Uzbekistan.
Also, if the Dominican Republic is called "Dominikam", how is it called "Dominica" (another Caribbean country)?
I have also created [https://mirad.miraheze.org/wiki/Yesu this] article.
Hoy! --[[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 06:57, 4 August 2022 (UTC)
:I will add these countries to the list. Thanks for noting their absence, plus the confusion with Dominican Republic. [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 16:55, 17 August 2022 (UTC)
== Translation ==
Hi! Could you please translate this to Mirad?
* Philosophy is the systematized study of general and fundamental questions, such as those about existence, reason, knowledge, values, mind, and language.
* Hello, Jonathan! > Hay, Jonathan! (are names translated or they remain the same?)
* Aristotle (384 BC – 7 March 322 BC) was a Greek philosopher. He was one of the most important philosophers in the history of Western civilization. He tutored Alexander the Great when Alexander was a child.
Thanks for your help. --[[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 13:10, 18 September 2022 (UTC)
:Textun se ha vyayabxwa tix bi zyasauna ay obyema didi, gel husi ayv esen, vyatex, ten, nazi, tep, ay dalzeyn.
:Aristotelis (348 JK - 7 jiib 322 JK) sa Helena textut. It sa awat bi ha gwa tesaga textuti be ha ajdin bi umera dotyen. It tuuxa Aleksandros ha Agala haj hu Aleksandros sa tud.
:This is the translation you requested. I have not decided how to handle foreign names, expect I think it would be best to stick to the original name of someone as close as possible, using whatever letters in Mirad reflect the pronunciation closest. Also, I may organize world country names to reflect the ISO standard. More about this later... [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 20:42, 29 September 2022 (UTC)
::Thank you so much for your translation. I have add the articles to the Wiki.
::Could you please translate this as well, whenever you have time?
::* First chapter
::* First May (1st May)
::* A man stands in a city. The man writes a journal. The man sees a city.
::* Does the man stand in a city? Yes, he stands in a city.
::* Does the man stand on... a man? No, he does not stand on a man. He stands in a city.
::Thanks for your help. [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 10:01, 1 October 2022 (UTC)
:::::* Aa dyesgon (or: Anapa dyesgon)
:::::* Aa jub bi Jiyob.
:::::* Tob kyose be dom. Ha tob dre jubdyes. Ha tob tease dom.
:::::* Duven ha tob kyose be dom? Va, it kyose be dom.
:::::* Duven ha tob kyose ab...tob? Vo, it voy kyose ab tob. It kyose be dom.
:::Better is English would be "A man IS STANDING in a city." (the progressive present tense = kyoseye). In either case, I think you may mean "The man LIVES or IS in a city."..... [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 17:27, 1 October 2022 (UTC)
::::Thanks for the translation. Yes, I meant "is standing", sorry. [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 18:16, 6 October 2022 (UTC)
== New translation ==
Hi, how are you?
Could you please translate this to Mirad?
* Film directors, screenwriters and actors
* Family and relationships
* Business and economics
* International organizations
* War and military
* Social issues
* Alexander III of Macedon (Greek: Αλέξανδρος, Aléxandros; 20/21 July 356 BC – 10/11 June 323 BC) commonly known as Alexander the Great, was king of the Ancient Greek kingdom of Macedon from 336 BC until his death in 323 BC. He was one of the greatest military leaders of all time. He was born in 356 BC in Pella, the ancient capital of Macedonia.
Thanks for your help. --[[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 15:55, 11 October 2022 (UTC)
:::* Dyezebi, dyezdruti, ay dyezuti
:::* Tod ay todati
:::* Ebkyax ay dobnastun
:::* Ebdooba xobi
:::* Dropek ay dop
:::* Dota soni
:::* Aleksandros III bi Mikim (Elid: Αλέξανδρος, Alexandros; 20/21 jiyeb 356 JaK - 10/11 jiyab 323 JaK) yansanay trawa gel Aleksandros ha Agala, sa edeb bi ha Ajoba Geroma Edebam bi Mikim bi 336 JaK ju ita toj bi 323 JaK. It sa awat bi ha agala dopa debi bi hya job. It tija be 356 JaK be Pella, ha ajoba debdom bi Mikim.
:[[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 21:03, 14 October 2022 (UTC)
::Thanks, could you please translate this?
::Does the man stand on a train? No, he does not stand on train. He stands in a city. The man stands in a city.
::Does the man write a journal? Yes, he writes a journal.
::Does the journal write the man? No, the journal does not write the man. A journal does not write. A man writes. The man writes the journal.
::Does the city see the man? No, the city does not see the man. A city does not see. A man sees. Does the man see the city? Yes, the man sees the city.
::Where is the man? He stands on a city. What does the man write? He writes a journal. What does the man see? He sees a city. He stands in a city, and he writes a journal, and he sees a city.
::Thank you. [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 13:22, 22 October 2022 (UTC)
:::I'm glad you are interested in Mirad. Why don't you try to translate your sentences yourself? [[Mirad_Grammar|Mirad Grammar]] has all the information you need to do the job. You can use the Mirad-English dictionary at the end to find words and expressions. I must tell you that I don't have time to do the work for you. By the way, in English, we translate Sp. "estar" with "to be, is, are, am, etc.", not "stand". So we say "<u>Is</u> the man on a train? He <u>is</u> in a city, etc." So, in Mirad, the former sentence would be '''Duven ha tob <u>se</u> be bixpur?''' [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 17:42, 23 October 2022 (UTC)
::::Hi, just to let you know, I have moved all the articles from the Mirad Wiki [https://plu-artificia-lingua.fandom.com/wiki/Category:Mirad here]. That wiki we created is going to be deleted so, in order to keep those articles, I have put them in the other one. [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 09:08, 27 April 2023 (UTC)
== Mirad ==
Hi, how are you? I have just found about your language and I wanted to ask you whether it is related to Kotava in any way and what is your opinion on Kotava compared to Mirad. Thanks. --[[User:Jon Gua|Jon Gua]] ([[User talk:Jon Gua|discuss]] • [[Special:Contributions/Jon Gua|contribs]]) 08:49, 16 March 2024 (UTC)
:Kotava has no relationship to Mirad. I like Kotava as an attractive language, but the vocabulary is completely random. All the words in Mirad relate to one another schematically, a bit like how a thesaurus groups words and their opposites. Once you learn '''zia''' (right), you automatically know '''zua''' (left) because the stem vowels are opposite. This saves a lot of studying. All words having to do with books, such as "library", "reader", "bookbinder", and "literate" contain the root "dye-" meaning "read". [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 14:57, 19 March 2024 (UTC)
::Thank you for your answer. Do you have any suggestions on how to learn the language? [[User:Jon Gua|Jon Gua]] ([[User talk:Jon Gua|discuss]] • [[Special:Contributions/Jon Gua|contribs]]) 15:16, 3 June 2024 (UTC)
:::In the book "Mirad Grammar", there are some lessons toward the end with mini-quizzes. It would help to learn the language by starting there. I will be adding lessons as I find the time. But just these few lessons will give you and idea how the language works and you can then study the grammar. [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 20:48, 5 June 2024 (UTC)
==[[:Hay, Jonathan!]]==
{{tmbox|type=delete|text='''Tyoyafud, please [[Wikibooks:Requests for deletion#Salute, Jonathan! and its translations|share your thoughts]] about whether to [[WB:WIW|keep]] or [[WB:DP|delete]] "[[:Hay, Jonathan!|Hay, Jonathan!]]".'''<br />You are being notified because you have contributed to this work. [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 10:48, 29 June 2025 (UTC)}}
== interested in Mirad!!! ==
I found this out from the Wikipedia page for conlangs and would LOVE to exchange emails to discuss this more with you.
also I for sci-fi purposes I think ''terira'' could work as a word for robot, it depends on the setting but a sapient android or robot would fit being called a thinking machine I'd imagine. [[User:Unluckyeight|Unluckyeight]] ([[User talk:Unluckyeight|discuss]] • [[Special:Contributions/Unluckyeight|contribs]]) 03:18, 25 May 2026 (UTC)
:Better yet: '''texir''' (a thinking machine). Thanks! [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 18:22, 2 June 2026 (UTC)
== 10,000+ words ==
Hey Jamie,
I have added your Mirad to the FrathWiki article "Conlangs with over 10,000 words" Check it out! Mirad appears to have the largest lexicon of any known conlang. Congratulations! [[Special:Contributions/~2026-45466-95|~2026-45466-95]] ([[User talk:~2026-45466-95|talk]]) 23:11, 20 August 2026 (UTC)
:The vocabulary of Mirad has now reached 150K word/expression pairings. I suspect, though, that Esperanto has the most glossed entries (judging from Wiktionary). [[User:Tyoyafud|Tyoyafud]] ([[User talk:Tyoyafud|discuss]] • [[Special:Contributions/Tyoyafud|contribs]]) 15:28, 10 September 2026 (UTC)
428rjts510ujm6rur1a3ocnravbijax
A Researcher's Guide to Local History Terminology/Researching local history
0
132913
4669625
3269927
2026-09-10T18:00:46Z
WereSpielChequers
248949
typo
4669625
wikitext
text/x-wiki
== Researching local history ==
Local history research is often taken up as a hobby by people without prior training or experience in the appropriate techniques and approaches. The very nature of local history is such that starting points are always available locally and lay researchers can learn the necessary skills as they study their subject in ever increasing depth. Archivists and societies can provide advice, encouragement, and information; formal courses of study are also widely available.
Most local history researchers follow a process in which they start from the basic facts offered by the available evidence, make a more detailed analysis of that evidence to explore its implications, and then put that analysis in its wider temporal and geographical context. Some take a more theoretical approach: starting from a hypothesis, which they seek to demonstrate or disprove through evidence.
=== Primary sources ===
These are records that were created at the time of an event. For example, a primary source for a birth date would be a birth certificate. While you can find birth dates on other documents, such as marriage certificates, they would not be primary sources for the birth date, because they were not created at the time of the birth.
The survival and availability of local records differs significantly from area to area. West <ref>J West, ''Village Records''</ref> is a good guide to what records may exist and how they might be used. Similarly Iredale <ref>D Iredale, ''Enjoying Archives''</ref> also describes where records may be found and how they can be used, although he originally wrote more than thirty years ago and is somewhat dated in parts. There are numerous guides to individual record categories <ref>NW Alcock, ''Old Title Deeds'' is a particularly good introduction to an under-used source for local history</ref> which can be found in bibliographies or referenced in more general works.
=== Secondary sources ===
A secondary source is a record that was created a significant amount of time after an event occurred. For example, a marriage certificate would be a secondary source for a birth date, because the birth took place several years before the time of the marriage. However, that same marriage certificate would be a primary source for a marriage date, because it was created at the time of the marriage.
There is often a local studies library which will contain a wealth of local material and web access. Early county historians <ref>Morant, ''History and Antiquities of Essex'' for example</ref> often provide parish by parish accounts, although they frequently include long descriptions of manorial descents which are of little interest to the current generation of historians. If there is a history of the parish church, this may well contain useful material.
Many books as secondary sources have a tendency to contain information which is of special interest to the author, even if the book titles are broadly similar. When researching a particular topic it is best to consult as many 'histories' as possible for vital clues can lurk in the most unexpected places. It is also true however that mistakes can be repeated through plagiarism by author after author and even exaggerated. This is the ever present problem with secondary sources of information.
===Using paintings, drawings, prints and photographs===
Photographs are usually reliable and can be interpreted directly and with confidence. (While this is true, remember that sources are created with intent by the author. Therefore a photo essay of a community may emphasize some areas, and omit others. As such, the use of photographic images as a primary basis for exploring a community may be limited. This is why it is always desirable to use multiple sources.)
Paintings and prints are open to artistic interpretation and / or a formulaic construction. For example the artist Gilpin<ref name="Gilpin">Gilpin, William (1786). ''Observations relative chiefly to picturesque beauty on several parts of England. Vol.1. Cumberland and Wrestmorland.'' R.Blamire. London.</ref> set a fashion for a romantic style of drawing and painting which influenced artists for many years and Billings<ref name="Billings">Billings, Robert William (1901). ''The Baronial and Ecclesiastical Antiquities of Scotland''. Pub. Oliver & Boyd.</ref> is famous for his stylised and romantised representation of Scottish castles, etc. Such sources can only be 'trusted' as factual in generalised terms.
=== Using old maps ===
Privately produced antique maps often go back several centuries, the Ordnance Survey (OS) itself did not start until the 19th-century. Many maps can be found either online [http://www.old-maps.co.uk/] or are available for study at libraries, purchasable at bookshops, etc.
Comparing maps sequentially by age can reveal a great deal of information about place names (etymology), landscape features, natural habitats, changing farming practices, etc. Older OS maps may have many place names which are left out on modern OS maps.
The 'Name Book' was the written record of the OS and this can be very helpful and informative. The OS is sometimes wrong, with examples of misnamed hills, burns, historical features, etc. which have never been corrected and have been repeated by other 'official' bodies. Such errors can sometimes be identified and corrected by making comparisons with pre-OS maps, an example being where the OS at first used the name 'Drumastle Mill,' then 'Drumcastle Mill,' however a 1747 map gives 'Drumaskus Mill.' An old 'Tower' was nearby and this may have led to the OS error during re-surveying, etc.
Old maps, through comparing various surveys, can also reveal the extent to which geographical features have been altered by the activities of man. Rivers were surprisingly often diverted by natural circumstances, the landowning class, factory owners, etc.; lakes were created through mining, quarrying, road construction, etc.; small hills were removed through quarrying, etc.; lakes drained for agriculture, etc., etc.
===Baronial or manorial records===
The Barony became the principal administrative unit of medieval landed estates in Scotland and its business was carried out in the Barony court before the laird or his baillie. The records of the Barony, and in particular its court, document many aspects of local agriculture, the resolution of disagreements between tenants, the transfer of property amongst tenants, etc.
Many lairds also had a legal heritable jurisdiction which permitted the laird of the barony to deal with certain minor criminal matters and regulate the sale of bread and ale. Baronies continued to function in a minor way until the early 20th century, but by this date the business of the courts had for a long time been dominated by the transfer of tenants' property.
The proceedings of the court and other documents give much information about local agriculture and the management of estates. Records reveal a great deal about the community living in the barony, its social structure, households, responsibilities, and the local economy.
=== Etymology ===
The names of habitations, hills, rivers, villages, etc. can reveal a great deal about the history of such features, especially if the name can be traced throughout its existence to show subtle changes which help to positively identify the original meaning. Such changes can be very complex and confusing, especially if they involve other languages, such as Cornish, Welsh, Scottish Gaelic, etc.
Local dialects can lead the local historian astray, as with 'Watermillock' beside Ullswater in the Lake District. The name seems to imply something along the lines of 'The small mill by a stream', whilst it actually involves the dialect word 'wethers' for sheep and 'hillock', or small hill.<ref name="Lee">Lee, Joan (1998). ''The Place Names of Cumbria''. Cumbria Heritage Services. {{ISBN|0-905404-70-X}}. P. 90</ref>
Even well established placenames may change with new ownership, such as with the farm 'Sandilands', which was change to 'Bankend' once Lord Torphichen of the Sandilands family, sold the estate on which the farm stood. In such cases extra confusion can effect historical researchers as the farm was renamed after a previous farm which once stood on another site some distance away.
A tradition, particularly in Victorian times, was to enhance the 'image' of a place by renaming it using more upper or middle class names. Maybole in Ayrshire for example had many streets renamed through the influence of a local minister.
A particular tradition that exists in parts of Ayrshire in Scotland and probably elsewhere, is to rename places after old family homes or estates, places of particular personal interest, etc. For example the Fergushill Manse became 'Janburrow' after Janet from Burrowland Farm and Bonnyton became 'Girgenti' after an historic site in Sicily. Landowners often altered names, such as that of Culzean castle, which used to be 'The cove', named after the caves that the castle stood on. Little Dreghorn near Dreghorn in North Ayrshire was changed to Fairlie after the family's main home on the Ayrshire coast.
Clues can also be found by speaking to local people who may provide the pronunciation of a name from a map, etc. which might be significantly different from the deduced pronunciation.
Another difficulty with the interpretation of placenames, standard expressions, etc. is that the meanings of words may have changed, for example the expression 'Pit and gallows' refers to a pit which was actually a form of dungeon or prison cell, not a pit for drowning the condemned. Words may also take on new meanings which supplant the original, for example a 'turnpike' was used for the spiral stairs in a tower and became more familiarly a term for the Toll Roads first constructed in the 18th-century.<ref name="Mackenzie">Mackenzie, W. Mackay (1927). The Mediaeval Castle in Scotland. Pub. Methuen & Co. Ltd., London.</ref>
Some descriptive terms were used very much in one locality, such as that of 'bastel-house' being confined to the East and Middle March of the Scottish - English border.
Some names can link certain features to industrial activity in the past, such as the name 'Red Boiler' which referred to the manufacture of soap at one particular site. Here the clues were that a plentiful supply of hardwood trees was a pre-requisite, together with a supply of animal carcasses, both of which the site had once provided in abundance. The folk memory of cast iron cauldrons at the site and the characteristic colour added to the circumstantial evidence.
Changes in the spoken language of an area results in the loss of some placenames and the corruption of others. Such changes may reflect such transition as that from Pictish to Gaelic to Scots and finally to English.
===Personal names===
The spelling of personal names, like that of placenames, was highly variable and only became consistent in the 19th century in many cases. Some spelling usages may reflect cadets of a family, such as with the Cunnnighame family, who used Cunninghame for the Glencairn and Corsehill branch; Cuninghame for Caddel and Monkredding; Cunningham for Baidland and Clonbeith; and finally Cuningham for Glengarnock.
When following family trees it is worth noting that many heirs changed their names to retain a traditional surname, as with the branch of the Seton family who inherited the Earldom of Eglinton and took the Montgomerie name associated with that title. This practise was sometimes a condition of inheritance or an act of gratitude.
=== Aerial and satellite imagery ===
Imagery from aerial reconnaissance is especially common from the first and second world wars. Some of which can be viewed in 3D. Such photographs are held by the Imperial War Museum and turn up at antique fairs, through on line auction, sites, etc.
Various websites can now provide satellite imagery which gives an overview, often in considerable detail, of areas which are being researched. Many sites additionally have live links on the satellite image which provide further details and sometimes link to sites such as Wikipedia, often providing much more information to the researcher. Features are usually easy to follow, such as Corpse roads, old railways, castles, rivers, rig and furrow systems, etc.
Taken together with maps, satellite imagery can clarify or add substantially to existing knowledge on a particular topic. The imagery is however not 'live' and can be several years old. Crop marks are sometimes visible, indicating the course of old roads, the position of old dwellings, etc. Due to the imagery being from above, some vertical structures can be hard to make out, only being visible by the shadows they cast, etc.
===The interpretation of landscape features===
There is no alternative than to keep an open mind and to develop or seek expert advice when making deductions from features in the landscape. Oliver Rackham is well known for his pioneering work on woodlands, leading to a better understanding of previous landscapes, which sustained lost crafts such as sawyers, digging temporary sawpits which collapsed upon themselves to leave 'grave' like features. They are often found in old woods, close to water and occasionally made with stone sides.<ref name="Rackham">Rackham, Oliver (1976). ''Trees and Woodland in the British Landscape.'' Pub. J.M.Dent & Sons Ltd. {{ISBN|0-460-04183-5}}.</ref> Q-pits are another landscape feature, found in woodlands or what has been woodland, they were kilns used to produce a sort of dried wood called 'white coal,' at one time used in the smelting of lead from the ore. Even old land usage can be deduced to some extent through examining the plants present, the form of trees, particular woodland boundary features, the presence or absence of coppicing, etc., etc. Some plants for instance have been known to linger on in one locality from the days of the monasteries and their 'physic' gardens.
=== Site visits and oral information ===
A visit is often essential, although satellite imagery can be a partial substitute. Local people rarely have a deep knowledge of their locality's history, however such information can be invaluable. It is often the case that site visits uncover the existence of primary sources of material such as photographs, deeds, etc. Additionally, personal contact with other local historians may result from meeting people local to an area.
=== Folklore, tradition and oral history===
Many places have a rich folklore and tradition which can be both a help and a hindrance. Usually a kernel of truth is associated with such historical records, however they often suffer from exaggeration, fusion with other events, the 'Chinese whispers' phenomenon and other corruptions of historical accuracy. It is important for the researcher to remain impartial and often the simpler the version the more truth it holds.
False memory syndrome is a very real problem and questions to 'local' interviewees should be framed without any leading facts which could distort the correspondents memory at that time or later.
Selena's Tree is an example of how stories develop. This tree stands near Kilwinning in Ayrshire, Scotland. One legends records that it was the meeting place of lovers; a man from Eglinton castle and a woman from the town. A second legend records that it was where a local witch was burned at the stake. The first story is pure romantic fiction, the second confuses the site with the nearby place of execution where a witch was executed and the truth is that a local lady named Selena walked to this tree every day for many following a stroke at a relatively early age.
=== Sharing information and encouraging others ===
Wikipedia and Wikibook sites enable local historians to make their work available to a very wide audience, inviting the assistance and contributions of others. Contacting 'interested' individuals via email, post, etc. can widen the use of such Wiki sites and actively involve people in the recording of their own local history. Researchers in other countries often have an interest in work done by local historians, leading to productive communications and furtherance of objectives.
The writers of articles do not have any form of veto and it is inevitable that opinions will sometimes differ, resulting in edits which may or may not be a real improvement. Such is life! The important thing is to keep enthusiastic and pursue the Wikiway (democracy).
One great advantage of writing information on websites such as the various Wiki sites is that it will not get lost or corrupted by accident; it is a secure home therefore. A disadvantage, certainly on Wikipedia, is the less than perfect hard copy provided through the printing options.
=== Notes ===
{{reflist|2}}
=== Bibliography ===
*The Victoria History of the Counties of England (VCH).
*Allison, K. J. (ed.) The Ealing Census
*Bede, History of the English Church and People (AD 731).
*Burke, Peter (ed.), New Perspectives on Historical Writing (Polity Press, 1991)
*Clanchy, M.T. From Memory to Written Record (Blackwell, 1992).
*Currie, C. R. J. and Lewis, C. P. A Guide to English County Histories (Thrupp: Sutton, 1994) {{ISBN|0-7509-0289-2}}
*Donaldson, Gordon and Morpeth, Robert S. (1977), A Dictionary of Scottish History. Edinburgh : John Donaldson. {{ISBN|0-85976-018-9}}
*Hoskins, W. G. The Making of the English Landscape.
*Phythian-Adams, Charles. ‘An Agenda for English Local History’, in Societies, Cultures and Kinship 1580-1850 (Leicester Univ. Press, 1993).
*Sheeran, George and Yanina. ‘Reconstructing Local History’, Local Historian (November 1999)
{{BookCat}}
21uc44yd2dqgdi96fh4mj1zzo3ojfr0
Wikibooks:Reading room/Administrative Assistance
4
140081
4669567
4669506
2026-09-10T12:47:35Z
MathXplore
3097823
Reporting Thenaoriudaipur
4669567
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
kn3cy0elkkkbln12gxc9mn0lt5yhh8h
4669574
4669567
2026-09-10T12:50:34Z
MathXplore
3097823
Reporting Networkkingss
4669574
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
== Networkkingss reported by MathXplore ==
* {{userlinks|Networkkingss}}
Link spam, [[Special:AbuseLog/315458]] <!-- USERREPORTED:/Networkkingss/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 10 September 2026 (UTC)
g3wp4kcn9y630cdfso4u0iuwrw5psig
4669595
4669574
2026-09-10T12:57:07Z
MathXplore
3097823
Reporting ~2026-49226-92
4669595
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
== Networkkingss reported by MathXplore ==
* {{userlinks|Networkkingss}}
Link spam, [[Special:AbuseLog/315458]] <!-- USERREPORTED:/Networkkingss/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 10 September 2026 (UTC)
== ~2026-49226-92 reported by MathXplore ==
* {{anonlinks|~2026-49226-92}}
Vandalism <!-- USERREPORTED:/~2026-49226-92/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:57, 10 September 2026 (UTC)
i3folwsl7wd02731p1p2b1idhbpiqof
4669606
4669595
2026-09-10T14:48:13Z
Codename Noreste
3441010
/* ~2026-49226-92 reported by MathXplore */ reply ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4669606
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
== Networkkingss reported by MathXplore ==
* {{userlinks|Networkkingss}}
Link spam, [[Special:AbuseLog/315458]] <!-- USERREPORTED:/Networkkingss/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 10 September 2026 (UTC)
== ~2026-49226-92 reported by MathXplore ==
* {{anonlinks|~2026-49226-92}}
Vandalism <!-- USERREPORTED:/~2026-49226-92/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:57, 10 September 2026 (UTC)
: {{done}}. I also nuked all pages created by this user and their connected temporary accounts based on their associated IP(s). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:48, 10 September 2026 (UTC)
g7ukbou5qwrllnjbx6rh8futfptsirz
4669607
4669606
2026-09-10T14:49:01Z
Codename Noreste
3441010
/* Networkkingss reported by MathXplore */ reply: {{done}}. (-) ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4669607
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
== Networkkingss reported by MathXplore ==
* {{userlinks|Networkkingss}}
Link spam, [[Special:AbuseLog/315458]] <!-- USERREPORTED:/Networkkingss/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 10 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:49, 10 September 2026 (UTC)
== ~2026-49226-92 reported by MathXplore ==
* {{anonlinks|~2026-49226-92}}
Vandalism <!-- USERREPORTED:/~2026-49226-92/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:57, 10 September 2026 (UTC)
: {{done}}. I also nuked all pages created by this user and their connected temporary accounts based on their associated IP(s). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:48, 10 September 2026 (UTC)
0aodyhha7435g11wt1ekl14q9xvdp10
4669608
4669607
2026-09-10T14:49:33Z
Codename Noreste
3441010
/* Thenaoriudaipur reported by MathXplore */ reply: {{done}}. (-) ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4669608
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:49, 10 September 2026 (UTC)
== Networkkingss reported by MathXplore ==
* {{userlinks|Networkkingss}}
Link spam, [[Special:AbuseLog/315458]] <!-- USERREPORTED:/Networkkingss/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 10 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:49, 10 September 2026 (UTC)
== ~2026-49226-92 reported by MathXplore ==
* {{anonlinks|~2026-49226-92}}
Vandalism <!-- USERREPORTED:/~2026-49226-92/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:57, 10 September 2026 (UTC)
: {{done}}. I also nuked all pages created by this user and their connected temporary accounts based on their associated IP(s). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:48, 10 September 2026 (UTC)
okq2erj8pwisb88hyt7m6n5id21m3cr
4669646
4669608
2026-09-11T08:10:59Z
ArchiverBot
1227662
Bot: Archiving 1 thread (older than 14 days) to [[Wikibooks:Reading room/Administrative Assistance/Archives/2026/August]]
4669646
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:AN|WB:AA}} {{TOC left}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
{{ombox|type=content|text='''To request a rename or usurpation''', go to the global request page at Meta [[meta:SRUC|here]].<br />''Please do not post those requests here!''}}
{{Clear}}
Welcome to the '''Administrative Assistance reading room'''. You can request assistance from [[WB:ADMIN|administrators]] for handling a variety of problems here and alert them about problems which may require special actions not normally used during regular content editing. Please be patient as administrators are often quite busy with either their own projects or trying to perform general maintenance and cleanup.
You can deal with most vandalism yourself: [[Wikibooks:Dealing with vandalism|fix it]], then [[Wikibooks:Templates/User_notices|warn the user]]. If there is repeated vandalism by one user, lots of vandalism on a single page, or vandalism from many users, tell an admin here, or in [irc://irc.freenode.net/wikibooks #wikibooks] (say <code>!admin</code> to get attention).
For more general questions and assistance that doesn't require an administrator, please use the [[WB:HELP|Assistance Reading Room]].
{{clear}}
[[Category:Reading room]]
== Gloriagulshan reported by MathXplore ==
* {{userlinks|Gloriagulshan}}
[[:w:Wikipedia:Sockpuppet investigations/Kagoz]] ([[Special:Contributions/Tikapara]], [[Wikibooks:Reading_room/Administrative_Assistance/Archives/2025/September#Tikapara_reported_by_MathXplore]]), created page [[Introduction to Filmmaking]] Contributed by Ali Zulfikar Zahedi ([[:w:Ali Zulfikar Zahedi]], [[:w:simple:Ali Zulfikar Zahedi]]) <!-- USERREPORTED:/Gloriagulshan/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 03:56, 29 August 2026 (UTC)
:I believe this page is intended as instructional material for learning filmmaking rather than as an encyclopedic article. I will revise the page to focus on practical filmmaking concepts, methods, and processes in accordance with the purpose of Wikibooks. [[User:Gloriagulshan|Gloriagulshan]] ([[User talk:Gloriagulshan|discuss]] • [[Special:Contributions/Gloriagulshan|contribs]]) 04:20, 29 August 2026 (UTC)
: Cc: {{ping|SHB2000|MarcGarver}} [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 04:41, 29 August 2026 (UTC)
::I see the account is glocked, and there are no sleepers that aren't already locked, so nothing more to do. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:18, 3 September 2026 (UTC)
== Atlanticgym reported by MathXplore ==
* {{userlinks|Atlanticgym}}
Link spam, [[Special:AbuseLog/315249]] <!-- USERREPORTED:/Atlanticgym/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:32, 29 August 2026 (UTC)
:{{done}} --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 12:35, 29 August 2026 (UTC)
== Makowe2026 reported by Veritas Sapientiae ==
* {{userlinks|Makowe2026}}
Spam <!-- USERREPORTED:/Makowe2026/ --> [[User:Veritas Sapientiae|Veritas Sapientiae]] ([[User talk:Veritas Sapientiae|discuss]] • [[Special:Contributions/Veritas Sapientiae|contribs]]) 13:53, 29 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:20, 29 August 2026 (UTC)
== Abir077 reported by MathXplore ==
* {{userlinks|Abir077}}
Link spam, [[Special:AbuseLog/315272]] <!-- USERREPORTED:/Abir077/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:07, 31 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:46, 31 August 2026 (UTC)
== Jeevandan26 reported by MathXplore ==
* {{userlinks|Jeevandan26}}
Link spam, [[Special:AbuseLog/315288]] <!-- USERREPORTED:/Jeevandan26/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:14, 1 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 1 September 2026 (UTC)
== Mohansai00116 reported by MathXplore ==
* {{userlinks|Mohansai00116}}
Link spam, [[Special:AbuseLog/315335]] <!-- USERREPORTED:/Mohansai00116/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:04, 3 September 2026 (UTC)
== Fatemai6 reported by MathXplore ==
* {{userlinks|Fatemai6}}
Link spam, [[Special:AbuseLog/315329]] <!-- USERREPORTED:/Fatemai6/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:10, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan147 reported by MathXplore ==
* {{userlinks|Kamrulhasan147}}
Link spam, [[Special:AbuseLog/315327]], [[Special:Contributions/Kamrulhasan142]] <!-- USERREPORTED:/Kamrulhasan147/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:12, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Kamrulhasan142 reported by MathXplore ==
* {{userlinks|Kamrulhasan142}}
Link spam, [[Special:AbuseLog/315295]], [[Special:Contributions/Kamrulhasan147]] <!-- USERREPORTED:/Kamrulhasan142/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Twenty7incgs reported by MathXplore ==
* {{userlinks|Twenty7incgs}}
Link spam, [[Special:AbuseLog/315323]] <!-- USERREPORTED:/Twenty7incgs/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:14, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Tailleash reported by MathXplore ==
* {{userlinks|Tailleash}}
Link spam, [[Special:AbuseLog/315318]] <!-- USERREPORTED:/Tailleash/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:15, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Md Akash Mia12 reported by MathXplore ==
* {{userlinks|Md Akash Mia12}}
Link spam, [[Special:AbuseLog/315299]], [[Special:AbuseLog/315298]] <!-- USERREPORTED:/Md Akash Mia12/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:17, 2 September 2026 (UTC)
: {{done|Page deleted}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 3 September 2026 (UTC)
== Vapesitefiftybar reported by MathXplore ==
* {{userlinks|Vapesitefiftybar}}
Link spam, [[Special:AbuseLog/315338]] <!-- USERREPORTED:/Vapesitefiftybar/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:40, 2 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:05, 3 September 2026 (UTC)
== Myteethtime1 reported by MathXplore ==
* {{userlinks|Myteethtime1}}
Spam <!-- USERREPORTED:/Myteethtime1/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 4 September 2026 (UTC)
: {{Done}} by MarcGarver. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Rajstartupservices reported by MathXplore ==
* {{userlinks|Rajstartupservices}}
Link spam, [[Special:AbuseLog/315363]] <!-- USERREPORTED:/Rajstartupservices/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 14:33, 4 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:28, 4 September 2026 (UTC)
== Reazulkarim545456 reported by MathXplore ==
* {{userlinks|Reazulkarim545456}}
Link spam, [[Special:AbuseLog/315377]] <!-- USERREPORTED:/Reazulkarim545456/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:39, 6 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:19, 6 September 2026 (UTC)
== Fahmidafy reported by MathXplore ==
* {{userlinks|Fahmidafy}}
Link spam, [[Special:AbuseLog/315378]] <!-- USERREPORTED:/Fahmidafy/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:40, 6 September 2026 (UTC)
: The filter stopped them three times, no action taken. Please re-report if they continue spamming. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:20, 6 September 2026 (UTC)
== Grow spark digital reported by MathXplore ==
* {{userlinks|Grow spark digital}}
Link spam, [[Special:AbuseLog/315381]] <!-- USERREPORTED:/Grow spark digital/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 06:42, 6 September 2026 (UTC)
: Only one filter hit, seems stale. Please re-report if they continue to spam. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 6 September 2026 (UTC)
== Korigosnacks reported by MathXplore ==
* {{userlinks|Korigosnacks}}
Link spam, [[Special:AbuseLog/315383]] <!-- USERREPORTED:/Korigosnacks/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:32, 6 September 2026 (UTC)
: Stale after only two filter hits and no edits. Please re-report if they spam later. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:56, 6 September 2026 (UTC)
== Athoyislam reported by MathXplore ==
* {{userlinks|Athoyislam}}
Spam <!-- USERREPORTED:/Athoyislam/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:47, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:31, 7 September 2026 (UTC)
== Jamal123lll reported by MathXplore ==
* {{userlinks|Jamal123lll}}
Link spam, [[Special:AbuseLog/315402]] <!-- USERREPORTED:/Jamal123lll/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:48, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:32, 7 September 2026 (UTC)
== Idontknowidkh reported by MathXplore ==
* {{userlinks|Idontknowidkh}}
online shopping spam, [[Special:AbuseLog/315400]] <!-- USERREPORTED:/Idontknowidkh/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 10:49, 7 September 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:33, 7 September 2026 (UTC)
== Ridhisharma1999 reported by MathXplore ==
* {{userlinks|Ridhisharma1999}}
Link spam, [[Special:AbuseLog/315435]] <!-- USERREPORTED:/Ridhisharma1999/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:01, 9 September 2026 (UTC)
:{{Done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:02, 9 September 2026 (UTC)
== Thenaoriudaipur reported by MathXplore ==
* {{userlinks|Thenaoriudaipur}}
Link spam, [[Special:AbuseLog/315473]] <!-- USERREPORTED:/Thenaoriudaipur/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:47, 10 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:49, 10 September 2026 (UTC)
== Networkkingss reported by MathXplore ==
* {{userlinks|Networkkingss}}
Link spam, [[Special:AbuseLog/315458]] <!-- USERREPORTED:/Networkkingss/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 10 September 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:49, 10 September 2026 (UTC)
== ~2026-49226-92 reported by MathXplore ==
* {{anonlinks|~2026-49226-92}}
Vandalism <!-- USERREPORTED:/~2026-49226-92/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:57, 10 September 2026 (UTC)
: {{done}}. I also nuked all pages created by this user and their connected temporary accounts based on their associated IP(s). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:48, 10 September 2026 (UTC)
8khln0umqlc4d4dg52efarz3fmf0abf
Fractals/Iterations in the complex plane/Mandelbrot set interior
0
141581
4669621
4581567
2026-09-10T17:50:17Z
WereSpielChequers
248949
typo
4669621
wikitext
text/x-wiki
This book shows how to code different algorithms for drawing parameter plane<ref>[[w:Complex quadratic polynomial#Parameter plane|parameter plane in wikipedia]]</ref> (Mandelbrot set<ref>[[w:Mandelbrot set|Mandelbrot set in wikipedia]]</ref>) for complex quadratic polynomial.<ref>[[w:complex quadratic polynomial|complex quadratic polynomial in wikipedia]]</ref>
One can find different types of points / sets on parameter plane.<ref>[http://www.reenigne.org/blog/mandelbrot-set-taxonomy/ reenigne blog : mandelbrot-set-taxonomy]</ref>
This page is about interior points of the Mandelbrot set.<ref>[https://www.acsu.buffalo.edu/~adamcunn/downloads/MandelbrotSet.pdf Displaying the Internal Structure of the Mandelbrot Set by A Cunningham ( with python 3 program and code)]</ref>
='''Interior of Mandelbrot set''' - hyperbolic components=
==The “Capture-Time” Algorithm: Iterations needed to Converge==
The “capture-time algorithm” is a natural counterpart for points inside the set to the “escape-time algorithm”. Given some desired tolerance, the orbit P is generated for each point c ∈ C until some point in the orbit is closer than to some previous point in the orbit. The number of iterations needed for this to occur is mapped to a color and displayed at the pixel corresponding to c. Adam Cunningham<ref>[https://www.acsu.buffalo.edu/~adamcunn/downloads/MandelbrotSet.pdf Displaying the Internal Structure of the Mandelbrot Set by Adam Cunningham]</ref>
==The Lyapunov exponent==
<gallery>
Lyapunov_2.png|whole set
Lyapunov exponents of the Mandelbrot set (The mini-Mandelbrot) - Matlab.png||mini Mandelbrot set
Lyapunov exponent of real quadratic map.png|real quadratic map
</gallery>
Math equation :<ref>[http://homepages.ulb.ac.be/~dgonze/TEACHING/logistic.pdf The logistic equation by Didier Gonze October 4, 2013]</ref>
<math>\lambda_f(z_0) = \lim_{n\rightarrow\infty} \frac{1}{n} \sum_{i=0}^{n-1} \left ( \ln\left|f'(z_i)\right | \right )</math>
where:
<math>f'(z) = \frac{d}{dz}f_c(z) = 2z</math>
means first derivative of f with respect to z
See also:
* image and description by janthor<ref>[http://www.janthor.com/Geo/MANDLJAP.HTM Ljapunov Exponent and mandelbrot set by janthor]</ref>
* image by Anders Sandberg<ref>[http://www.flickr.com/photos/arenamontanus/3408610381/ Image by Anders Sandberg ]</ref>
HLSL code by JPBotelho<ref>[https://github.com/JPBotelho/Fractal-Megacollection github repo JPBotelho: Fractal-Megacollection ( HLSL shaders for Unity)]</ref>
<syntaxhighlight lang=HLSL>
Shader "Fractals/Coloring Techniques/Escape-Time"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Iter ("Iterations", Range(0, 250)) = 100
_Dividend ("Dividend", Range (0, 0.5)) = 15
_Zoom ("Zoom", Range (0.1, 1000)) = 0.65
_Position ("Offset", Vector) = (0.4, 0, 0, 0)
_Background ("Background", Color) = (0, 0.25, 1, 0)
_Origin ("Origin", Color) = (0, 0, 0, 0)
}
SubShader
{
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Complex.cginc"
#include "FractalOperations.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
int _Iter;
fixed _Zoom;
fixed _Dividend;
float2 _Position;
fixed4 _Background;
fixed4 _Origin;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float x0 = (ClampScaleX(i.uv) + _Position.x) / _Zoom;
float y0 = (ClampScaleY(i.uv) + _Position.y) / _Zoom;
float2 z = float2(x0, y0);
float2 c = float2(x0, y0);
int iteration = 0;
float l = 0;
while (IsBounded(z, 40) && iteration < _Iter)
{
l += log (cabs(2 * z));
z = cmul(z, z);
z += c;
iteration++;
}
l /= iteration;
if (l > 0)
return _Background;
float3 color = tanh(l >= 0 ?
float3(0, 0.7 * log(1 + l), log(1 + l)) :
3 * float3(_Origin.x-l, _Origin.y-l * 0.1, _Origin.z));
return float4(color + _Dividend, 1);
}
ENDCG
}
}
CustomEditor "FractalEditor"
}
</syntaxhighlight>
==Interior distance estimation==
[[Image:Mandelbrot_Interior_600.png|thumb|Interior distance estimation]]
[[Fractals/Iterations in the complex plane/demm#Interior distance estimation|DEM/M - description of the method]]
==absolute value of the orbit==
<syntaxhighlight lang=octave>
# Hypercomputing the Mandelbrot Set? by Petrus H. Potgieter February 1, 2008
n=1000; # For an nxn grid
m=50; # Number of iterations
c=meshgrid(linspace(-2,2,n))\ # Set up grid
+i*meshgrid(linspace(2,-2,n))’;
x=zeros(n,n); # Initial value on grid
for i=1:m
x=x.^2+c; # Iterate the mapping
endfor
imagesc(min(abs(x),2.1)) # Plot monochrome, absolute
# value of 2.1 is escape
</syntaxhighlight>
===internal level sets===
Color of point:
* is proportional to the value of z is at final iteration.
* shows internal level sets of periodic attractors.
===bof60===
Image of bof60 in on page 60 in the book "the Beauty Of Fractals".Description of the method described on page 63 of bof. It is used only for interior points of the Mandelbrot set.
Color of point is proportional to:
* the smallest distance of its orbit from [[w:origin|origin]]<ref>[http://spanky.triumf.ca/WWW/FRACTINT/append_a_misc.html Fractint : Misc. Options and algorithms]</ref><ref>[http://flylib.com/books/en/2.758.1.140/1/ Java™ Number Cruncher: The Java Programmer's Guide to Numerical Computing By Ronald Mak]</ref>
* the smallest value z gets during iteration<ref>[http://www.mysticfractal.com/firefly.pdf Firefly Application Help by Terry W. Gintz ]</ref>
* illuminating the closest approach the iterates of the origin (critical point) make to the origin inside the set
* "Each pixel of each particular video frame represents a particular complex number c = a + ib. For each sequential frame n, the magnitude of z(c,n) := z(c, n-1)^2 + c is displayed as a grayscale intensity value at each of these points c: larger magnitude points are whiter, smaller magnitudes are darker. As n rises from 1 to 256, points outside the Mandelbrot Set quickly saturate to pure white, while points within the Mandelbrot Set oscillate through the darker intensities." Brian Gawalt<ref>[https://www.youtube.com/watch?v=39YQJfF2txs Mandelbrot Oscillations by Brian Gawalt ]</ref>
Level sets of distance are sets of points with the same distance<ref>[http://karmak.org/archive/2003/01/quaternions.txt Fractint doc by Noel Giffin]</ref>
<syntaxhighlight lang=C>
if (Iteration==IterationMax)
/* interior of Mandelbrot set = color is proportional to modulus of last iteration */
else { /* exterior of Mandelbrot set = black */
color[0]=0;
color[1]=0;
color[2]=0;
}
</syntaxhighlight>
* fragment of code : fractint.cfrm from Gnofract4d<ref>[http://gnofract4d.sourceforge.net/ gnofract4d]</ref>
bof60 {
init:
float mag_of_closest_point = 1e100
loop:
float zmag = |z|
if zmag < mag_of_closest_point
mag_of_closest_point = zmag
endif
final:
#index = sqrt(mag_of_closest_point) * 75.0/256.0
}
See also
* [https://github.com/jeremy-rifkin/mandelbrot-trajectory-infima Mandelbrot Trajectory Infima by jeremy-rifkin Jeremy Rifkin]
* [https://www.acsu.buffalo.edu/~adamcunn/downloads/MandelbrotSet.pdf Displaying the Internal Structure of the Mandelbrot Set by Adam Cunningham ]
===bof61 or atom domains===
[[Fractals/Iterations in the complex plane/atomdomains|Full description]]
<gallery caption="Bof61">
Mandelbrot Atom Domains Animation.gif|animation
Bof61.png|2D
MandelbrotOrbitInfimum.png|3D
</gallery>
==Period of hyperbolic components==
[[Image:Mandelbrot Set – Periodicities coloured.png|right|thumb|period of hyperbolic components]]
Period of hyperbolic component of Mandelbrot set is a period of limit set of critical orbit.
Algorithms for computing [[Fractals/Mathematics/Period|period]]:
* direct period detection from iterations of critical point z = 0.0 on dynamical plane
* "quick and dirty" algorithm : check if <math>abs(z_n ) < eps </math> then colour c-point with colour n. Here n is a period of attracting orbit and eps is a radius of circle around attracting point = precision of numerical computations
* "methods based on interval arithmetic when implemented properly are capable of finding all period-n cycles for considerable large n." (ZBIGNIEW GALIAS )<ref>[http://www.zet.agh.edu.pl/~galias/publ.html Rigorous Investigations Of Periodic Orbits In An Electronic Circuit By Means Of Interval Methods by Zbigniew Galias]</ref>
* Floyd's cycle-finding algorithm<ref>[http://milan_va.sweb.cz/Mandelbrot/ Mandelbrot set drawing by Milan]</ref>
* the spider algorithm
* [[Fractals/Iterations in the complex plane/atomdomains|atom domain, BOF61]]
* [[Fractals/Iterations_in_the_complex_plane/Mandelbrot_set/mandelbrot#Period_detection|Period detection]]
=== interior detection ===
Pixel is interior with high probability if all below is <ref>[https://fractalforums.org/noobs-corner/76/determining-optimal-iterations-to-skip-with-series-approximation/4964 fractalforums.org : determining-optimal-iterations-to-skip-with-series-approximation]</ref>
* pixel is marked as interior ( black)
* all surrounding pixels are marked as interior ( black)
* all the black pixels have the same period
==internal coordinate and multiplier map==
[[File:Mandelbrot Components.svg|thumb|right|Components of Mandelbrot set computed using multiplier map]]
[[File:Mandelbrot set - multiplier map.png|thumb|right|Mandelbrot set - multiplier map]]
[[Fractals/Iterations in the complex plane/def cqp#Multiplier map|definition]]
* interior coordinate<ref>[http://mathr.co.uk/blog/2013-04-01_interior_coordinates_in_the_mandelbrot_set.html interior_coordinates_in_the_mandelbrot_set by Claude Heiland-Allen]</ref><ref>[http://mathr.co.uk/blog/2014-11-02_practical_interior_distance_rendering.html practical interior_distance rendering by Claude Heiland-Allen]</ref><ref>[https://math.stackexchange.com/questions/1151489/test-for-membership-in-mandelbrot-bulb-of-period-n/1151953#1151953 math.stackexchange question: test-for-membership-in-mandelbrot-bulb-of-period-n/1151953#1151953]</ref>
The algorithm by Claude Heiland-Allen:
* check c
** When c is outside the Mandelbrot set
*** give up now
*** or use external coordinate
** when c is not outside (inside or on the boundary) : For each period p, starting from 1 and increasing:
*** Find periodic point z0 such that fp(z0,c)=z0 using [[Fractals/Iterations in the complex plane/periodic points#Newton method|Newton's method]] in one complex variable
*** Find b by evaluating first derivative with respect to z of fp at z0
*** If |b|≤1 then return b, otherwise continue with the next p
===computing===
For periods:<ref>[https://www.mrob.com/pub/muency/brownmethod.html Brown Method by Robert P. Munafo, 2003 Sep 22. ]</ref>
* 1 to 3 explicit equations can be used<ref>[https://www.mrob.com/pub/muency/exactcoordinates.html Exact Coordinates by Robert P. Munafo, 2003 Sep 22. ]</ref>
* >3 it must be find using numerical methods
====period 1====
Start with [[Fractals/Iterations in the complex plane/Mandelbrot set/boundary#Solving system of equation for period 1|boundary equation]]:
c+(w/2)^2-w/2=0;
and solve it for w
<pre>
(%i1) eq1:c+(w/2)^2-w/2=0;
2
w w
(%o1) -- - - + c = 0
4 2
(%i2) solve(eq1,w);
(%o2) [w = 1 - sqrt(1 - 4 c), w = sqrt(1 - 4 c) + 1]
(%i3) s:solve(eq1,w);
(%o3) [w = 1 - sqrt(1 - 4 c), w = sqrt(1 - 4 c) + 1]
(%i4) s:map(rhs,s);
(%o4) [1 - sqrt(1 - 4 c), sqrt(1 - 4 c) + 1]
</pre>
so
w = w(c) = 1.0 - csqrt(1.0-4.0*c)
====period 2====
w = 4.0*c + 4;
====period 3====
<math> c^3 + 2c^2 - (w/8-1)c + (w/8-1)^2 = 0</math>
It can be solved using Maxima CAS:
<pre>
(%i1) e1:c^3 + 2*c^2 - (w/8-1)*c + (w/8-1)^2 = 0;
3 2 w w 2
(%o1) c + 2 c + (1 - -) c + (- - 1) = 0
8 8
(%i2) solve(e1,w);
(%o2) [w = (- 4 sqrt((- 4 c) - 7) c) + 4 c + 8, w = 4 sqrt((- 4 c) - 7) c + 4 c + 8]
</pre>
====numerical approximation====
<syntaxhighlight lang=c>
complex double AproximateMultiplierMap(complex double c, int period, double eps2, double er2)
{
complex double z; // variable z
complex double zp ; // periodic point
complex double zcr = 0.0; // critical point
complex double d = 1;
int p;
// first find periodic point
zp = GivePeriodic( c, zcr, period, eps2, er2); // Find periodic point z0 such that Fp(z0,c)=z0 using Newton's method in one complex variable
// Find w by evaluating first derivative with respect to z of Fp at z0
if ( cabs2(zp)<er2) {
z = zp;
for (p=0; p < period; p++){
d = 2*z*d; /* first derivative with respect to z */
z = z*z +c ; /* complex quadratic polynomial */
}}
else d= 10000; //
return d;
}
</syntaxhighlight>
See also:
* [https://www.youtube.com/watch?t=879&v=oNxPSP2tQEk&feature=youtu.be Number Sequences in the Mandelbrot Set by the Mathemagicians' Guild]
===Internal angle===
[[File:Vektorattraktorbrot in 010002 s.png|thumb|right|interior of Mandelbrots set coloured with radial angle]]
Method by Renato Fonseca :<ref>[http://web.ist.utl.pt/renato.fonseca/mandelbrotset.html The Mandelbrot set by Renato Fonseca]</ref>
"a point c in the set is given a hue equal to argument
<math>arg(z_{n_{max}}) = arctan\frac{Im(z_{n_{max}})}{Re(z_{n_{max}})}</math>
(scaled appropriately so that we end up with a number in the range 0 - 255). The number z_nmax is the last one calculated in the z's sequence."
See also:
* [https://www.youtube.com/watch?v=Gmjk5G2TrSo [Extra Visual<nowiki>]</nowiki> Building a Mandelbrot Set Step-by-step by The Mathemagicians' Guild]
====Fractint====
[[Fractals/fractint|Fractint]] : Color Parameters : INSIDE=ATAN
colors by determining the angle in degrees the last iterated value has with respect to the real axis, and using the absolute value. This feature should be used with periodicity=0<ref>[http://www.nahee.com/spanky/www/fractint/color_params.html fractint color params]</ref>
===Internal rays===
From Hyperbolic to Parabolic Parameters along Internal Rays<ref>[https://www.researchgate.net/publication/370227599%20From%20Hyperbolic%20to%20Parabolic%20Parameters%20along%20Internal%20Rays From Hyperbolic to Parabolic Parameters along Internal Rays by Yi-Chiuan Chen and Tomoki Kawahira]</ref>
<gallery>
Mandel ie 1 3.jpg|Internal and external rays
Mandelbrot set - multiplier map.png|multiplier map and internal rays
Wakes near the period 1 continent in the Mandelbrot set.png|internal and external rays
</gallery>
When <math>radius\,</math> varies and <math>angle\,</math> is constant then <math>c\,</math> goes along [[Fractals/Iterations_in_the_complex_plane/def_cqp#Internal_ray|internal ray]].<ref>[[w:external ray|internal ray in wikipedia ]]</ref> It is used as a '''path''' inside Mandelbrot set.
<syntaxhighlight lang=c>
double complex Give_c(double t, double r, int p)
{
/*
input:
InternalRadius = r in [0,1]
InternalAngleInTurns = t in range [0,1]
p = period
output = c = complex point of 2D parameter plane
*/
complex double w = 0.0;
complex double c = 0.0;
t = t*2*M_PI; // from turns to radians
// point of unit circle
w = r* cexp(I*t);
// map circle to component
switch (p){
case 1: c = (2.0*w - w*w)/4.0; break;
case 2: c = (w -4.0)/ 4.0; break;
}
return c;
}
</syntaxhighlight>
<syntaxhighlight lang="c">
/* find c in component of Mandelbrot set
uses complex type so #include <complex.h> and -lm
uses code by Wolf Jung from program Mandel
see function mndlbrot::bifurcate from mandelbrot.cpp
http://www.mndynamics.com/indexp.html
*/
double complex GiveC(double InternalAngleInTurns, double InternalRadius, unsigned int period)
{
//0 <= InternalRay<= 1
//0 <= InternalAngleInTurns <=1
double t = InternalAngleInTurns *2*M_PI; // from turns to radians
double R2 = InternalRadius * InternalRadius;
double Cx, Cy; /* C = Cx+Cy*i */
switch ( period ) {
case 1: // main cardioid
Cx = (cos(t)*InternalRadius)/2-(cos(2*t)*R2)/4;
Cy = (sin(t)*InternalRadius)/2-(sin(2*t)*R2)/4;
break;
case 2: // only one component
Cx = InternalRadius * 0.25*cos(t) - 1.0;
Cy = InternalRadius * 0.25*sin(t);
break;
// for each period there are 2^(period-1) roots.
default: // safe values
Cx = 0.0;
Cy = 0.0;
break; }
return Cx+ Cy*I;
}
// draws points to memory array data
int DrawInternalRay(double InternalAngleInTurns, unsigned int period, int iMax, unsigned char data[])
{
complex double c;
double InternalRadius;
double RadiusStep; // between radius of points
int i; // number of point to draw
RadiusStep = 1.0/iMax;
for(i=0;i<=iMax;++i){
InternalRadius = i * RadiusStep;
c = GiveC(InternalAngleInTurns, InternalRadius, period);
DrawPoint(c,data);
}
return 0;
}
</syntaxhighlight>
Example: internal ray of angle = 1/6 of main cardioid.
Internal angle:
<math>angle = 1/6 \,</math>
radius of ray:
<math> 0 \le radius \le 1 \,</math>
Point of internal radius of unit circle:
<math> w = radius * e^{i * angle}\,</math>
Map point <math>w</math> to parameter plane:
<math>c = \frac{w}{2} - \frac{w^2}{4} \,</math>
For <math>epsilon = 0 \,</math> this is equation for main cardioid.
===Internal curve===
When <math>radius\,</math> is constant varies and <math>angle\,</math> varies then <math>c\,</math> goes along internal curve.
<syntaxhighlight lang="c">
/* find c in component of Mandelbrot set
uses complex type so #include <complex.h> and -lm
uses code by Wolf Jung from program Mandel
see function mndlbrot::bifurcate from mandelbrot.cpp
http://www.mndynamics.com/indexp.html
*/
double complex GiveC(double InternalAngleInTurns, double InternalRadius, unsigned int period)
{
//0 <= InternalRay<= 1
//0 <= InternalAngleInTurns <=1
double t = InternalAngleInTurns *2*M_PI; // from turns to radians
double R2 = InternalRadius * InternalRadius;
double Cx, Cy; /* C = Cx+Cy*i */
switch ( period ) {
case 1: // main cardioid
Cx = (cos(t)*InternalRadius)/2-(cos(2*t)*R2)/4;
Cy = (sin(t)*InternalRadius)/2-(sin(2*t)*R2)/4;
break;
case 2: // only one component
Cx = InternalRadius * 0.25*cos(t) - 1.0;
Cy = InternalRadius * 0.25*sin(t);
break;
// for each period there are 2^(period-1) roots.
default: // safe values
Cx = 0.0;
Cy = 0.0;
break;
}
return Cx+ Cy*I;
}
// draws points to memory array data
int DrawInternalCurve(double InternalRadius , unsigned int period, int iMax, unsigned char data[])
{
complex double c;
double InternalAngle; // in turns = from 0.0 to 1.0
double AngleStep;
int i;
// int iMax =100;
AngleStep = 1.0/iMax;
for (i=0; i<=iMax; ++i) {
InternalAngle = i * AngleStep;
c = GiveC(InternalAngle, InternalRadius, period);
DrawPoint(c,data);
}
return 0;
}
</syntaxhighlight>
===Centers of components===
* [[Fractals/Iterations in the complex plane/def cqp#Nucleus or center of hyperbolic component|definition]]
* [[Fractals/Iterations in the complex plane/Mandelbrot set/centers|Methods of finding centers]]
=More tutorials and code=
<gallery>
Alg9n5.png
Vektorattraktorbrot_in_010000_s.png
Mandelbrot-Iterates.gif
</gallery>
Tutorials
* in Basic see [http://www.mandelbrot-dazibao.com Mandelbrot Dazibao]
* in Java see [http://www.ibiblio.org/e-notes/MSet/Contents.htm Evgeny Demidov]
* in C see [http://linas.org/art-gallery/ Linas Vepstas]
* in C++ see [http://www.mndynamics.com/indexp.html Wolf Jung] page,
* in [[w:Factor (programming language)|Factor]] [http://gitweb.factorcode.org/gitweb.cgi?p=factor/.git;a=tree;f=extra/benchmark/mandel;hb=HEAD program ] by Slava Pestov
* in Gnuplot see [http://t16web.lanl.gov/Kawano/gnuplot/fractal/mandelbrot-e.html Tutorial by T.Kawano]
* in Lisp (Maxima) see:
** [http://maxima.sourceforge.net/docs/manual/en/maxima_49.html Dynamics by Jaime E. Villate]
** [http://www.mrob.com/pub/muency.html Mu-Ency - The Encyclopedia of the Mandelbrot Set by Robert P. Munafo]
** [http://ygingras.net/fract Frac by Yannick Gingras] with beautiful [http://gazdemo.ygingras.net/wiki/Fract+gallery+1gallery]
** [http://www.takayaiwamoto.com/Fractal/Fractals.html Fractals in Lisp by Takaya Iwamoto]
* in Octave see [[Octave Programming Tutorial/Loops and conditions|wikibooks]] or another version by [http://nullprogram.com/blog/2007/09/02/ Christopher Wellons]
* [http://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand How to Plot the Mandelbrot Set By Hand]
* comparison of various languages:
** [http://shootout.alioth.debian.org/u32q/performance.php?test=mandelbrot Computer Language Benchmarks Game : Compare the performance of ≈30 programming languages using ≈12 flawed benchmarks for 4 different combinations of OS/machine.]
** [http://rosettacode.org/wiki/Mandelbrot_set rosettacode]
** [http://www.timestretch.com/FractalBenchmark.html Fractal Benchmark] in Ruby, Io, PHP, Python, Lua, Java, Perl, Applescript, TCL, ELisp, Javascript, OCaml, Ghostscript, and C by Erik Wrenholt
** in PDL, IDL, MATLAB, Octave, C and FORTRAN77 by [http://www.freesoftwaremagazine.com/articles/cool_fractals_with_perl_pdl_a_benchmark Xavier Calbet]
* ASCI graphic :<ref>[[wikipedia:ASCII graphic|ASCII graphic]]</ref>
**[http://www.mrob.com/pub/muency/asciigraphics.html ASCII Graphics at Mu-Ency by Robert P. Munafo]
** using scripting languages by [http://warp.povusers.org/MandScripts/ Warp]
** [http://theowoll.orgfree.com/benchmark.html Fractal Benchmark by Theo Wollenleben]
** using Lisp on [http://bc.tech.coop/blog/040811.html Bill Clementson's blog]
* 3D
** [http://images.math.cnrs.fr/Benoit-Mandelbrot.html 3D images of Mandelbrot set]
** [http://www.josleys.com/show_gallery.php?galid=336 3d images by Jos Leys]
<gallery>
File:Wiki Mandel zoom 03 seehorse 3D.jpg|This is a 3D version of the image "Mandel zoom 03 seehorse.jpg" DEM
File:Halfhypercomplexmandel3D.jpg|Half 3D hypercomplex Mandelbrot Fractal. Rendered with Mandelbulber 0.80.
</gallery>
=References=
<references/>
{{BookCat}}
f5hu6k9z4tnatfshulwd1q8h758k8gq
Vehicle Identification Numbers (VIN codes)/World Manufacturer Identifier (WMI)
0
142006
4669641
4669456
2026-09-11T06:28:53Z
~2026-49431-52
3625679
/* */
4669641
wikitext
text/x-wiki
LZZLCLWB4MW791643
==World Manufacturer Identifier==
The first three characters uniquely identify the manufacturer of the vehicle using the '''World Manufacturer Identifier''' or '''WMI''' code. A manufacturer that builds fewer than 1000 vehicles per year uses a 9 as the third digit and the 12th, 13th and 14th position of the VIN for a second part of the identification. Some manufacturers use the third character as a code for a vehicle category (e.g., bus or truck), a division within a manufacturer, or both. For example, within 1G (assigned to General Motors in the United States), 1G1 represents Chevrolet passenger cars; 1G2, Pontiac passenger cars; and 1GC, Chevrolet trucks.
===WMI Regions===
The first character of the WMI is the region in which the manufacturer is located. In practice, each is assigned to a country of manufacture. Common auto-manufacturing countries are noted. <ref>{{cite web
| url=https://standards.iso.org/iso/3780/
| title=ISO Standards Maintenance Portal: ISO 3780
| publisher=[[wikipedia:International Organization for Standardization]]}}</ref>
{| class="wikitable" style="text-align:center"
|-
! WMI
! Region
! Notes
|-
| A-C
| Africa
| AA-AH = South Africa<br />BF-BG = Kenya<br />BU = Uganda<br />CA-CB = Egypt<br />DF-DK = Morocco
|-
| E, H-R
| Asia
| E=Russia<br />H = China<br />J = Japan<br />KF-KH = Israel<br />KL-KR = South Korea<br />L = China<br />MA-ME = India<br />MF-MK = Indonesia<br />ML-MR = Thailand<br />MS = Myanmar<br />MX = Kazakhstan<br />MY-M0 = India<br />NF-NG = Pakistan<br />NL-NR = Turkey<br />NS-NT = Uzbekistan<br />PA-PC = Philippines<br />PF-PG = Singapore<br />PL-PR = Malaysia<br />PS-PT = Bangladesh<br />PV=Cambodia<br />RA-RB = United Arab Emirates<br />RF-RK = Taiwan<br />RL-RN = Vietnam<br />RS-RT = Saudi Arabia<br />RU-RW = Russia<br />R1-R7 = Hong Kong
|-
| S-Z
| Europe
| SA-SM = United Kingdom<br />SN-ST = Germany (formerly East Germany)<br />SU-SZ = Poland<br />TA-TH = Switzerland<br />TJ-TP = Czech Republic<br />TR-TV = Hungary<br />TW-T2 = Portugal<br />UH-UM = Denmark<br />UN-UR = Ireland<br />UU-UX = Romania<br />U1-U2 = North Macedonia<br />U5-U7 = Slovakia<br />VA-VE = Austria<br />VF-VR = France<br />VS-VW = Spain<br />VX-V2 = France (formerly Serbia/Yugoslavia)<br />V3-V5 = Croatia<br />V6-V8 = Estonia<br /> W = Germany (formerly West Germany)<br />XA-XC = Bulgaria<br />XF-XH = Greece<br />XL-XR = The Netherlands<br />XS-XW = Russia (formerly USSR)<br />XX-XY = Luxembourg<br />XZ-X0 = Russia<br />YA-YE = Belgium<br />YF-YK = Finland<br />YS-YW = Sweden<br />YX-Y2 = Norway<br />Y3-Y5 = Belarus<br />Y6-Y8 = Ukraine<br />ZA-ZU = Italy<br />ZX-ZZ = Slovenia<br />Z3-Z5 = Lithuania<br />Z6-Z0 = Russia
|-
| 1-5
| North America
| 1, 4, 5 = United States<br />2 = Canada<br />3 = Mexico<br />7F-70 = United States
|-
| 6-7
| Oceania
| 6A-6W = Australia<br />7A-7E = New Zealand<br />Revised: 6A-6X = Australia<br />6Y-61 = New Zealand
|-
| 8-9
| South America
| 8A-8E = Argentina<br />8F-8G = Chile<br />8L-8N = Ecuador<br />8S-8T = Peru<br />8X-8Z = Venezuela<br />82 = Bolivia<br />84 = Costa Rica<br />9A-9E, 91-90 = Brazil<br />9F-9G = Colombia<br />9S-9V = Uruguay
|}
{| class="wikitable" style="text-align:center"
|-
!
! A
! B
! C
! D
! E
! F
! G
! H
! J
! K
! L
! M
! N
! P
! R
! S
! T
! U
! V
! W
! X
! Y
! Z
! 1
! 2
! 3
! 4
! 5
! 6
! 7
! 8
! 9
! 0
|-
| '''A''' || colspan="8" | South Africa || colspan="2" | Ivory Coast || colspan="2" | Lesotho || colspan="2" | Botswana || colspan="2" | Namibia || colspan="2" | Madagascar || colspan="2" | Mauritius || colspan="2" | Tunisia || colspan="2" | Cyprus || colspan="2" | Zimbabwe || colspan="2" | Mozambique || colspan="5" | ''Africa''
|-
| '''B''' || colspan="2" | Angola || colspan="1" | Ethiopia || colspan="2" | ''Africa'' || colspan="2" | Kenya || colspan="1" | Rwanda || colspan="2" | ''Africa'' || colspan="1" | Nigeria || colspan="3" | ''Africa'' || colspan="1" | Algeria || colspan="1" | ''Africa'' || colspan="1" | Swaziland || colspan="1" | Uganda || colspan="7" | ''Africa''|| colspan="2" | Libya || colspan="6" | ''Africa''
|-
| '''C''' || colspan="2" | Egypt || colspan="3" | ''Africa'' || colspan="2" | Morocco || colspan="3" | ''Africa'' || colspan="2" | Zambia || colspan="21" | ''Africa''
|-
| '''D''' || colspan="33" rowspan="1" |
|-
| '''E''' || colspan="33" | Russia
|-
| '''F''' || colspan="33" rowspan="2" |
|-
| '''G'''
|-
| '''H''' || colspan="33" | China
|-
| '''J''' || colspan="33" | Japan
|-
| '''K''' || colspan="5" | ''Asia'' || colspan="3" | Israel || colspan="2" | ''Asia'' || colspan="5" | South Korea || colspan="2" | Jordan || colspan="6" | ''Asia'' || colspan="3" | South Korea || colspan="1" | ''Asia'' || colspan="1" | Kyrgyzstan || colspan="5" | ''Asia''
|-
| '''L''' || colspan="33" | China
|-
| '''M''' || colspan="5" | India || colspan="5" | Indonesia || colspan="5" | Thailand || colspan="1" | Myanmar || colspan="1" | ''Asia'' || colspan="1" | Mongolia || colspan="2" | ''Asia'' || colspan="1" | Kazakhstan || colspan="12" | India
|-
| '''N''' || colspan="5" | Iran || colspan="2" | Pakistan || colspan="1" | ''Asia'' || colspan="1" | Iraq || colspan="1" | ''Asia'' || colspan="5" | Turkey || colspan="2" | Uzbekistan || colspan="1" | ''Asia'' || colspan="1" | Azerbaijan || colspan="1" | ''Asia'' || colspan="1" | Tajikistan || colspan="1" | Armenia || colspan="1" | ''Asia'' || colspan="5" | Iran || colspan="1" | ''Asia'' || colspan="2" | Turkey || colspan="2" | ''Asia''
|-
| '''P''' || colspan="3" | Philippines || colspan="2" | ''Asia'' || colspan="2" | Singapore || colspan="3" | ''Asia'' || colspan="5" | Malaysia || colspan="2" | Bangladesh || colspan="10" | ''Asia'' || colspan="6" | India
|-
| '''R''' || colspan="2" | UAE || colspan="3" | ''Asia'' || colspan="5" | Taiwan || colspan="3" | Vietnam || colspan="1" | Laos || colspan="1" | ''Asia'' || colspan="2" | Saudi Arabia || colspan="3" | Russia || colspan="3" | ''Asia'' || colspan="7" | Hong Kong || colspan="3" | ''Asia''
|-
!
! A
! B
! C
! D
! E
! F
! G
! H
! J
! K
! L
! M
! N
! P
! R
! S
! T
! U
! V
! W
! X
! Y
! Z
! 1
! 2
! 3
! 4
! 5
! 6
! 7
! 8
! 9
! 0
|-
| '''S''' || colspan="12" | United Kingdom || colspan="5" | Germany <small>(formerly East Germany)</small> || colspan="6" | Poland || colspan="2" | Latvia || colspan="1" | Georgia || colspan="1" | Iceland || colspan="6" | ''Europe''
|-
| '''T''' || colspan="8" | Switzerland || colspan="6" | Czech Republic || colspan="5" | Hungary || colspan="6" | Portugal || colspan="3" | Serbia || colspan="1" | Andorra || colspan="2" | Netherlands || colspan="2" | ''Europe''
|-
| '''U''' || colspan="3" | Spain || colspan="4" | ''Europe'' || colspan="5" | Denmark || colspan="3" | Ireland || colspan="2" | ''Europe'' || colspan="4" | Romania || colspan="2" | ''Europe'' || colspan="2" | North Macedonia || colspan="2" | ''Europe'' || colspan="3" | Slovakia || colspan="3" | Bosnia & Herzogovina
|-
| '''V''' || colspan="5" | Austria || colspan="10" | France || colspan="5" | Spain || colspan="5" | France <small>(formerly Yugoslavia & Serbia)</small> || colspan="3" | Croatia || colspan="3" | Estonia || colspan="2" | ''Europe''
|-
| '''W''' || colspan="33" | Germany
|-
| '''X''' || colspan="3" | Bulgaria || colspan="2" | Russia || colspan="3" | Greece || colspan="2" | Russia || colspan="5" | Netherlands || colspan="5" | Russia <small>(formerly USSR)</small> || colspan="2" | Luxembourg || colspan="11" | Russia
|-
| '''Y''' || colspan="5" | Belgium || colspan="5" | Finland || colspan="2" | ''Europe'' || colspan="1" | Malta || colspan="2" | ''Europe'' || colspan="5" | Sweden || colspan="5" | Norway || colspan="3" | Belarus || colspan="3" | Ukraine || colspan="2" | ''Europe''
|-
| '''Z''' || colspan="18" | Italy || colspan="2" | ''Europe'' || colspan="3" | Slovenia || colspan="1" | San Marino|| colspan="1" | ''Europe''|| colspan="3" | Lithuania || colspan="5" | Russia
|-
| '''1''' || colspan="33" | United States
|-
| '''2''' || colspan="28" | Canada || colspan="5" | ''North America''
|-
| '''3''' || colspan="21" | Mexico || colspan="5" | ''North America'' || colspan="1" | Nicaragua || colspan="1" | Dom. Rep. || colspan="1" | Honduras || colspan="1" | Panama || colspan="2" | Puerto Rico || colspan="1" | ''North America''
|-
| '''4''' || colspan="33" rowspan="2" | United States
|-
| '''5'''
|-
| '''6''' || colspan="21" | Australia || colspan="3" | New Zealand || colspan="9" | ''Oceania''
|-
| '''7''' || colspan="5" | New Zealand || colspan="28" | United States
|-
| '''8''' || colspan="5" | Argentina || colspan=2 | Chile || colspan="3" | ''South America'' || colspan="3" | Ecuador || colspan="2" | ''South America'' || colspan="2" | Peru || colspan="3" | ''South America'' || colspan="3" | Venezuela || colspan="1" | ''SA'' || colspan="1" | Bolivia || colspan="1" | ''SA'' || colspan="1" | Costa Rica || colspan="6" | ''South America''
|-
| '''9''' || colspan="5" | Brazil || colspan="2" | Colombia || colspan="8" | ''South America'' || colspan="4" | Uruguay || colspan="4" | ''South America'' || colspan="10" | Brazil
|-
| '''0''' || colspan="33" rowspan="1" |
|}
===List of Many WMIs===
The [[w:Society of Automotive Engineers|Society of Automotive Engineers]] (SAE) in the US assigns WMIs to countries and manufacturers.<ref>{{cite web
| url=https://www.iso.org/standard/45844.html
| title=ISO 3780:2009 - Road vehicles — World manufacturer identifier (WMI) code
| date=October 2009
| publisher=International Organization for Standardization}}</ref> The following table contains a list of mainly commonly used WMIs, although there are many others assigned.
{| class="wikitable x" style="text-align:center"
|-
! WMI !! Manufacturer
|-
| AAA|| Audi South Africa made by Volkswagen of South Africa
|-
| AAK|| FAW Vehicle Manufacturers SA (PTY) Ltd.
|-
| AAM|| MAN Automotive (South Africa) (Pty) Ltd. (includes VW Truck & Bus)
|-
|AAP || VIN restamped by South African Police Service (so-called SAPVIN or AAPV number)
|-
| AAV || Volkswagen South Africa
|-
| AAW || Challenger Trailer Pty Ltd. (South Africa)
|-
| AA9/CN1 || TR-Tec Pty Ltd. (South Africa)
|-
| ABJ || Mitsubishi Colt & Triton pickups made by Mercedes-Benz South Africa 1994–2011
|-
| ABJ || Mitsubishi Fuso made by Daimler Trucks & Buses Southern Africa
|-
| ABM || BMW Southern Africa
|-
| ACV || Isuzu Motors South Africa 2018-
|-
| AC5 || [[../Hyundai/VIN Codes|Hyundai]] Automotive South Africa
|-
| AC9/BM1 || Beamish Beach Buggies (South Africa)
|-
| ADB || Mercedes-Benz South Africa car
|-
| ADD || UD Trucks Southern Africa (Pty) Ltd.
|-
| ADM || General Motors South Africa (includes Isuzu through 2018)
|-
| ADN || Nissan South Africa (Pty) Ltd.
|-
| ADR || Renault Sandero made by Nissan South Africa (Pty) Ltd.
|-
| ADX || Tata Automobile Corporation (SA) Ltd.
|-
| AE9/MT1 || Backdraft Racing (South Africa)
|-
| AFA || Ford Motor Company of Southern Africa & Samcor
|-
| AFB || Mazda BT-50 made by Ford Motor Company of Southern Africa
|-
| AFD || BAIC Automotive South Africa
|-
| AFZ || Fiat Auto South Africa
|-
| AHH || Hino South Africa
|-
| AHM || Honda Ballade made by Mercedes-Benz South Africa 1982–2000
|-
| AHT || Toyota South Africa Motors (Pty.) Ltd.
|-
| BF9/|| KIBO Motorcycles, Kenya
|-
| BUK || Kiira Motors Corporation, Uganda
|-
| BR1 || Mercedes-Benz Algeria (SAFAV MB)
|-
| BRY || FIAT Algeria
|-
| CA3 || MCV bus (Egypt)
|-
| DDY || Geyushi Motors (bus) (Egypt)
|-
| DF9/|| Laraki (Morocco)
|-
| EAA || Aurus Motors (Russia)
|-
| EAN || Evolute (Russia)
|-
| EAU || Elektromobili Manufacturing Rus - EVM (Russia)
|-
| EBE || Sollers-Auto (Russia)
|-
| EBZ || Nizhekotrans bus (Russia)
|-
| ECE || XCITE (Russia)
|-
| ECW || Trans-Alfa bus (Russia)
|-
| EDE || Tenet (Russia)
|-
| HAC || GAC Motor (Aion)
|-
| HA0 || Wuxi Sundiro Electric Vehicle Co., Ltd. (Palla, Parray)
|-
| HA6 || Jiangsu Niu Electric Technology Co., Ltd. (Niu)
|-
| HA7 || Jinan Qingqi KR Motors Co., Ltd.
|-
| HES || smart Automobile Co., Ltd. (Mercedes-Geely joint venture)
|-
| HGL || Farizon Auto van (Geely)
|-
| HGX || Wuling Motors commercial vehicle (Geely)
|-
| HHZ || Huazi Automobile
|-
| HJN || Nio, Firefly
|-
| HJR || Chery Commercial Vehicle (Anhui) Co., Ltd. Jetour made by Chery Commercial Vehicle
|-
| HJZ || Juzhen Chengshi van
|-
| HJ4 || BAW car
|-
| HLX || Li Auto
|-
| HL4 || Zhejiang Morini Vehicle Co., Ltd. <br />(Moto Morini subsidiary of Taizhou Zhongneng Motorcycle Co., Ltd.)
|-
| HRV || Beijing Henrey Automobile Technology Co., Ltd.
|-
| HT5 || Zhejiang Jianying Locomotive Co., Ltd. (motorcycle)
|-
| HVW || Volkswagen Anhui
|-
| HWM || WM Motor Technology Co., Ltd. (Weltmeister)
|-
| HXM || Xiaomi
|-
| HZ2 || Taizhou Zhilong Technology Co., Ltd (motorcycle)
|-
| H0D || Taizhou Qianxin Vehicle Co., Ltd. (motorcycle)
|-
| H0G || Wisdom (Fujian) Motor Co., Ltd. (bus)
|-
| JAA || Isuzu truck, Holden Rodeo TF, Opel Campo, Bedford/Vauxhall Brava pickup made by Isuzu in Japan
|-
| JAB || Isuzu car
|-
| JAC || Isuzu SUV, Opel/Vauxhall Monterey & Holden Jackaroo/Monterey made by Isuzu in Japan
|-
| JAE || Acura SLX made by Isuzu
|-
| JAL || Isuzu commercial trucks & <br /> Chevrolet commercial trucks made by Isuzu 2016+ & <br /> Hino S-series truck made by Isuzu (Incomplete Vehicle - medium duty)
|-
| JAM || Isuzu commercial trucks (Incomplete Vehicle - light duty)
|-
| JA3 || Mitsubishi car (for North America)
|-
| JA4 || Mitsubishi MPV/SUV (for North America) & Nissan Rogue PHEV '26 made by Mitsubishi
|-
| JA7 || Mitsubishi truck (for North America)
|-
| JB3 || Dodge car made by Mitsubishi Motors
|-
| JB4 || Dodge MPV/SUV made by Mitsubishi Motors
|-
| JB7 || Dodge truck made by Mitsubishi Motors
|-
| JC0 || Ford brand cars made by Mazda
|-
| JC1 || Fiat 124 Spider made by Mazda
|-
| JC2 || Ford Courier made by Mazda
|-
| JDA || Daihatsu, Subaru Justy made by Daihatsu
|-
| JD1 || Daihatsu car
|-
| JD2 || Daihatsu SUV
|-
| JD4 || Daihatsu truck
|-
| JE3 || Eagle car made by Mitsubishi Motors
|-
| JE4 || Mitsubishi Motors
|-
| JF1 || [[../Subaru/VIN Codes|Subaru]] car & Scion FR-S/Toyota 86/Toyota GR86 made by Subaru
|-
| JF2 || [[../Subaru/VIN Codes|Subaru]] SUV
|-
| JF3 || [[../Subaru/VIN Codes|Subaru]] truck
|-
| JF4 || Saab 9-2X made by Subaru
|-
| JG1 || Chevrolet/Geo car made by Suzuki
|-
| JG2 || Pontiac car made by Suzuki
|-
| JG7 || Pontiac/Asuna car made by Suzuki for GM Canada
|-
| JGC || Chevrolet/Geo SUV made by Suzuki (classified as a truck)
|-
| JGT || GMC SUV made by Suzuki for GM Canada (classified as a truck)
|-
| JHA || Hino truck
|-
| JHB || Hino incomplete vehicle
|-
| JHD || Hino
|-
| JHF || Hino
|-
| JHH || Hino incomplete vehicle
|-
| JHF-JHG, JHL-JHN, JHZ,<br/>JH1-JH5 || [[../Honda/VIN Codes|Honda]]
|-
| JHL || [[../Honda/VIN Codes|Honda]] MPV/SUV
|-
| JHM || [[../Honda/VIN Codes|Honda]] car
|-
| JH1 || [[../Honda/VIN Codes|Honda]] truck
|-
| JH2 || [[../Honda/VIN Codes|Honda]] motorcycle/ATV
|-
| JH3 || [[../Honda/VIN Codes|Honda]] ATV
|-
| JH4 || Acura car
|-
| JH6 || Hino incomplete vehicle
|-
| JJ3 || Chrysler brand car made by Mitsubishi Motors
|-
| JKA || Kawasaki (motorcycles)
|-
| JKB || Kawasaki (motorcycles)
|-
| JKM || Mitsuoka
|-
| JKS || Suzuki Marauder 1600/Boulevard M95 motorcycle made by Kawasaki
|-
| JK8 || Suzuki QUV620F UTV made by Kawasaki
|-
| JLB || Mitsubishi Fuso Truck & Bus Corp.
|-
| JLF || Mitsubishi Fuso Truck & Bus Corp.
|-
| JLS || Sterling Truck 360 made by Mitsubishi Fuso Truck & Bus Corp.
|-
| JL5 || Mitsubishi Fuso Truck & Bus Corp.
|-
| JL6 || Mitsubishi Fuso Truck & Bus Corp.
|-
| JL7 || Mitsubishi Fuso Truck & Bus Corp.
|-
| JMA || Mitsubishi Motors (right-hand drive) for Europe
|-
| JMB || Mitsubishi Motors (left-hand drive) for Europe
|-
| JMF || Mitsubishi Motors for Australia (including Mitsubishi Express made by Renault)
|-
| JMP || Mitsubishi Motors (left-hand drive)
|-
| JMR || Mitsubishi Motors (right-hand drive)
|-
| JMY || Mitsubishi Motors (left-hand drive) for South America & Middle East
|-
| JMZ || Mazda for Europe export & Mazda 2 made by Ford Spain & Mazda 2 Hybrid made by Toyota Motor Manufacturing France
|-
| JM0 || Mazda for Oceania export
|-
| JM1 || Mazda car
|-
| JM2 || Mazda truck
|-
| JM3 || Mazda MPV/SUV
|-
| JM4 || Mazda
|-
| JM6 || Mazda
|-
| JM7 || Mazda
|-
| JNA || Nissan Diesel/UD Trucks (incomplete vehicle)
|-
| JNC || Nissan Diesel/UD Trucks
|-
| JNE || Nissan Diesel/UD Trucks (truck)
|-
| JNK || Infiniti car
|-
| JNR || Infiniti SUV
|-
| JNX || Infiniti incomplete vehicle
|-
| JN1 || Nissan car & Infiniti car
|-
| JN3 || Nissan incomplete vehicle
|-
| JN6 || Nissan truck/van & Mitsubishi Fuso Canter Van
|-
| JN8 || Nissan MPV/SUV & Infiniti SUV
|-
| JPA || International Trucks made by Nissan Diesel (incomplete vehicle)
|-
| JPB || International Trucks made by Nissan Diesel (tractor truck)
|-
| JPC || Nissan Diesel/UD Trucks
|-
| JPE || International Trucks made by Nissan Diesel (truck)
|-
| JP3 || Plymouth car made by Mitsubishi Motors
|-
| JP4 || Plymouth MPV/SUV made by Mitsubishi Motors
|-
| JP7 || Plymouth truck made by Mitsubishi Motors
|-
| JR2 || Isuzu Oasis made by Honda
|-
| JSA || Suzuki ATV & '03 Kawasaki KFX400 ATV made by Suzuki, Suzuki car/SUV (outside N. America), Holden Cruze YG made by Suzuki
|-
| JSK || Kawasaki KLX125/KLX125L motorcycle made by Suzuki
|-
| JSL || '04-'06 Kawasaki KFX400 ATV made by Suzuki
|-
| JST || Suzuki Across SUV made by Toyota
|-
| JS1 || Suzuki motorcycle & Kawasaki KLX400S/KLX400SR motorcycle made by Suzuki
|-
| JS2 || Suzuki car
|-
| JS3 || Suzuki SUV
|-
| JS4 || Suzuki truck
|-
| JTB || Toyota bus
|-
| JTD || Toyota car
|-
| JTE || Toyota MPV/SUV
|-
| JTF || Toyota van/truck
|-
| JTG || Toyota MPV/bus
|-
| JTH || Lexus car
|-
| JTJ || Lexus SUV
|-
| JTK || Toyota car
|-
| JTL || Toyota SUV
|-
| JTM || Toyota SUV, Subaru Uncharted, Solterra, and Trailseeker made by Toyota
|-
| JTN || Toyota car
|-
| JTP || Toyota SUV
|-
| JT1 || [[../Toyota/VIN Codes|Toyota]] van
|-
| JT2 || Toyota car
|-
| JT3 || Toyota MPV/SUV
|-
| JT4 || Toyota truck/van
|-
| JT5 || Toyota incomplete vehicle
|-
| JT6 || Lexus SUV
|-
| JT7 || Toyota bus/van
|-
| JT8 || Lexus car
|-
| JW6 || Mitsubishi Fuso division of Mitsubishi Motors (through mid-2003)
|-
| JYA || Yamaha motorcycles
|-
| JYE || Yamaha snowmobile
|-
| JY3 || Yamaha 3-wheel ATV
|-
| JY4 || Yamaha 4-wheel ATV
|-
| J81 || Chevrolet/Geo car made by Isuzu
|-
| J87 || Pontiac/Asüna car made by Isuzu for GM Canada
|-
| J8B || Chevrolet commercial trucks made by Isuzu (incomplete vehicle - medium duty)
|-
| J8C || Chevrolet commercial trucks made by Isuzu (truck)
|-
| J8D || GMC commercial trucks made by Isuzu (incomplete vehicle - medium duty)
|-
| J8T || GMC commercial trucks made by Isuzu (truck)
|-
| J8Z || Chevrolet LUV pickup truck made by Isuzu (truck)
|-
| KF3 || Merkavim (Israel)
|-
| KF6 || Automotive Industries, Ltd. (Israel)
|-
| KF9/004 || Tomcar (Israel)
|-
| KG9/002 || Charash Ashdod (truck trailer) (Israel)
|-
| KG9/004 || H. Klein (truck trailer) (Israel)
|-
| KG9/007 || Agam Trailers (truck trailer) (Israel)
|-
| KG9/009 || Merkavey Noa (trailer) (Israel)
|-
| KG9/010 || Weingold Trailers (trailer) (Israel)
|-
| KG9/011 || Netzer Sereni (truck trailer) (Israel)
|-
| KG9/015 || Merkaz Hagrorim (trailer) (Israel)
|-
| KG9/035 || BEL Technologies (truck trailer) (Israel)
|-
| KG9/091 || Jansteel (truck trailer) (Israel)
|-
| KG9/101 || Bassamco (truck trailer) (Israel)
|-
| KG9/104 || Global Handasa (truck trailer) (Israel)
|-
| KL || Daewoo [[../GM/VIN Codes|General Motors]] South Korea
|-
| KLA || Daewoo/GM Daewoo/GM Korea (Chevrolet/Alpheon)<br /> from Bupyeong & Kunsan plants
|-
| KLP || CT&T United (battery electric low-speed vehicles)
|-
| KLT || Tata Daewoo
|-
| KLU || Tata Daewoo
|-
| KLY || Daewoo/GM Daewoo/GM Korea (Chevrolet) from Changwon plant (Tico/Matiz/Matiz Creative/Spark/Damas/Labo)
|-
| KL1 || GM Daewoo/GM Korea (Chevrolet car)
|-
| KL2 || Daewoo/GM Daewoo (Pontiac car)
|-
| KL3 || GM Daewoo/GM Korea (Holden)
|-
| KL4 || GM Korea (Buick MPV/SUV)
|-
| KL5 || GM Daewoo (Suzuki car) US: 2004-2008, Canada: 2004-2011
|-
| KL5 || Daewoo Bus Corp./Zyle Daewoo Bus 2004-2017
|-
| KL6 || GM Daewoo (GMC MPV/SUV)
|-
| KL7 || Daewoo (GM Canada brands: Passport car, Asuna car (Pre-2000))
|-
| KL7 || GM Daewoo/GM Korea (Chevrolet MPV/SUV (Post-2000))
|-
| KL8 || GM Daewoo/GM Korea (Chevrolet car from Changwon plant (Spark))
|-
| KM || [[../Hyundai/VIN Codes|Hyundai]]
|-
| KMC || Hyundai commercial truck
|-
| KME || Hyundai commercial truck (semi-tractor)
|-
| KMF || Hyundai van & commercial truck & Bering Truck
|-
| KMH || Hyundai car & Mitsubishi Precis ('87 - 3/10/88) & Mexican market Dodges made by Hyundai
|-
| KMJ || Hyundai minibus/bus
|-
| KMT || Genesis Motor car
|-
| KMU || Genesis Motor SUV
|-
| KMX || Hyundai Galloper SUV
|-
| KMY || Daelim Motor Company, Ltd/DNA Motors Co., Ltd. (motorcycles)
|-
| KM1 || Hyosung Motors (motorcycles)
|-
| KM4 || Hyosung Motors/S&T Motors/KR Motors (motorcycles)
|-
| KM8 || Hyundai SUV
|-
| KNA || Kia car
|-
| KNC || Kia truck
|-
| KND || Kia MPV/SUV & Hyundai Entourage
|-
| KNE || Kia for Europe export
|-
| KNF || Kia, special vehicles
|-
| KNG || Kia minibus/bus
|-
| KNJ || Ford Festiva & Aspire made by Kia
|-
| KNL || Kia Elan/Vigato made by Kia Motech
|-
| KNM || Renault Samsung Motors, Nissan Rogue made by Renault Samsung, Nissan Sunny made by Renault Samsung
|-
| KNM || Renault Korea Co., Ltd.
|-
| KN1 || Asia Motors
|-
| KN2 || Asia Motors
|-
| KPA || SsangYong/KG Mobility (KGM) pickup
|-
| KPB || SsangYong car or For S. Korea domestic market: SsangYong/KG Mobility (KGM) SUV/MPV
|-
| KPD || SsangYong bus (TransStar, Istana minibus, Rodius/Korando Turismo 11-seater)
|-
| KPH || Mitsubishi Precis (3/11/88 - '94)
|-
| KPT || SsangYong/KG Mobility (KGM) SUV/MPV (For export)
|-
| LAA || Shanghai Jialing Vehicle Co., Ltd. (motorcycle)
|-
| LAE || Jinan Qingqi Motorcycle
|-
| LAL || Sundiro [[../Honda/VIN Codes|Honda]] Motorcycle
|-
| LAN || Changzhou Yamasaki Motorcycle
|-
| LAP || Chongqing Jianshe Motorcycle Co., Ltd.
|-
| LAP || Zhuzhou Nanfang Motorcycle Co., Ltd.
|-
| LAT || Luoyang Northern Ek Chor Motorcycle Co., Ltd. (Dayang)
|-
| LA6 || Xiamen King Long United Automotive Industry Co., Ltd. (bus)
|-
| LA7 || Radar Auto, Farizon Auto (Geely)
|-
| LA8 || Anhui Ankai
|-
| LA9/AYS || Jiangsu Alfa Bus Co., Ltd. (bus)
|-
| LA9/BFC || Beijing North Huade Neoplan Bus Co., Ltd.
|-
| LA9/FBC || Xiamen Fengtai Bus & Coach International Co., Ltd. (FTBCI) (bus)
|-
| LA9/HFF || Anhui Huaxia Vehicle Manufacturing Co., Ltd. (bus)
|-
| LA9/JXK || CHTC Bonluck Bus Co., Ltd.
|-
| LA9/LC0 || BYD
|-
| LA9/LFJ || Xinlongma Automobile
|-
| LA9/LM6 || SRM Shineray
|-
| LBB || Zhejiang Qianjiang Motorcycle (QJ Motor/Keeway/Benelli)
|-
| LBE || Beijing [[../Hyundai/VIN Codes|Hyundai]] (Hyundai, Shouwang)
|-
| LBM || Zongshen Piaggio
|-
| LBP || Chongqing Jianshe Yamaha Motor Co. Ltd. (motorcycles)
|-
| LBV || BMW Brilliance (BMW, Zinoro)
|-
| LBX || Jiangsu Kinroad Xintian Motorcycle Manufacture Co. Ltd. (motorcycles)
|-
| LBZ || Yantai Shuchi Vehicle Co., Ltd. (bus)
|-
| LB1 || Fujian Benz
|-
| LB2 || Geely Motorcycles
|-
| LB3 || Zhejiang Geely Holding Group (Geely, Galaxy, Geometry, Kandi)
|-
| LB4 || Chongqing Yinxiang Motorcycle Group Co., Ltd.
|-
| LB5 || Foshan City Fosti Motorcycle Co., Ltd.
|-
| LB7 || Tibet New Summit Motorcycle Co., Ltd.
|-
| LCE || Hangzhou Chunfeng Motorcycles (CFMOTO)
|-
| LCR || Gonow
|-
| LC0 || BYD Auto (BYD, Denza)
|-
| LC2 || Changzhou Kwang Yang Motor Co., Ltd. (Kymco)
|-
| LC6 || Changzhou Haojue Suzuki Motorcycle Co. Ltd.
|-
| LDB || Dadi Auto
|-
| LDC || Dongfeng Peugeot Citroen Automobile Co., Ltd. (DPCA), Dongfeng Fengshen (Aeolus) L60
|-
| LDD || Dandong Huanghai Automobile
|-
| LDF || Dezhou Fulu Vehicle Co., Ltd. (motorcycles), BAW Yuanbao electric car (Ace P1 in Norway)
|-
| LDK || FAW Bus (Dalian) Co., Ltd.
|-
| LDN || Soueast (South East (Fujian) Motor Co., Ltd.) including Mitsubishi made by Soueast
|-
| LDP || Dongfeng, Dongfeng Fengshen (Aeolus), Voyah, Renault City K-ZE/Venucia e30 made by eGT New Energy Automotive
|-
| LDY || Zhongtong Bus Holding Co. Ltd.
|-
| LD3 || Guangdong Tayo Motorcycle Technology Co. (Zontes) (motorcycle)
|-
| LD5 || Benzhou Vehicle Industry Group Ltd. (motorcycle)
|-
| LD9/L3A || SiTech (FAW)
|-
| LEC || Tianjin Qingyuan Electric Vehicle Co., Ltd.
|-
| LEF || Jiangling Motors Corporation Ltd. (JMC)
|-
| LEH || Zhejiang Riya Motorcycle Co. Ltd.
|-
| LET || Jiangling-Isuzu Motors, China
|-
| LEW || Dongfeng commercial vehicle
|-
| LE4 || Beijing Benz & Beijing Benz-Daimler Chrysler Automotive Co. (Chrysler, Jeep, Mitsubishi, Mercedes-Benz) & Beijing Jeep Corp.
|-
| LE8 || Guangzhou Huaye Electric Vehicle Technology Co., Ltd. (Formerly Guangzhou Panyu Huanan Motors Group Co., Ltd.) (motorcycles)
|-
| LFB || FAW Group (Bestune, Hongqi) & Mazda made under license by FAW (Mazda 8, CX-7)
|-
| LFF || Zhejiang Taizhou Wangye Power Co., Ltd.
|-
| LFG || Taizhou Chuanl Motorcycle Manufacturing
|-
| LFJ || Fujian Motors Group (Keyton)
|-
| LFM || FAW Toyota Motor (Toyota, Ranz)
|-
| LFN || FAW Bus (Wuxi) Co., Ltd. (truck, bus)
|-
| LFP || FAW Car, Bestune, Hongqi (passenger vehicles) & Mazda made under license by FAW (Mazda 6, CX-4)
|-
| LFT || FAW (trailers)
|-
| LFU || Lifeng Group Co., Ltd. (motorcycles)
|-
| LFV || FAW-Volkswagen (VW, Audi, Jetta, Kaili)
|-
| LFW || FAW JieFang (truck)
|-
| LFX || Sany Heavy Industry (truck)
|-
| LFY || Changshu Light Motorcycle Factory
|-
| LFZ || Leapmotor
|-
| LF3 || Lifan Motorcycle
|-
| LGA || Dongfeng Commercial Vehicle Co., Ltd. trucks
|-
| LGB || Dongfeng Nissan (Nissan, Infiniti, Venucia)
|-
| LGB || Dongfeng Commercial Vehicle Co., Ltd.
|-
| LGC || Dongfeng Commercial Vehicle Co., Ltd. bus chassis
|-
| LGD || Dongfeng Commercial Vehicle Co., Ltd.
|-
| LGF || Dongfeng Commercial Vehicle Co., Ltd. bus chassis
|-
| LGG || Dongfeng Liuzhou Motor (Forthing/Fengxing)
|-
| LGJ || Dongfeng Fengshen (Aeolus)
|-
| LGL || Guilin Daewoo
|-
| LGV || Heshan Guoji Nanlian Motorcycle Industry Co., Ltd.
|-
| LGW || Great Wall Motor (GWM, Haval, Ora, Tank, Wey)
|-
| LGX || BYD Auto (BYD, Fangchengbao)
|-
| LGZ || Guangzhou Denway Bus
|-
| LG6 || Dayun Group
|-
| LHA || Shuanghuan Auto
|-
| LHB || Beijing Automotive Industry Holding
|-
| LHG || GAC Honda (Honda, Everus, Acura)
|-
| LHJ || Chongqing Astronautic Bashan Motorcycle Manufacturing Co., Ltd.
|-
| LHM || Dongfeng Renault Automobile Co.
|-
| LHW || CRRC Electric Vehicle Co., Ltd. (bus)
|-
| LH0 || WM Motor Technology Co., Ltd. (Weltmeister)
|-
| LH1 || FAW-Haima, China
|-
| LJC || Jincheng Corporation
|-
| LJD || Yueda Kia (previously Dongfeng Yueda Kia) (Kia, Horki) & Human Horizons - HiPhi (made under contract by Yueda Kia)
|-
| LJM || Sunlong (bus)
|-
| LJN || Zhengzhou Nissan
|-
| LJR || CIMC Vehicles Group (truck trailer)
|-
| LJS || Yaxing Coach, Asiastar Bus
|-
| LJU || Shanghai Maple Automobile & Kandi & Zhidou
|-
| LJU || Lotus Technology (Wuhan Lotus Cars Co., Ltd.)
|-
| LJV || Sinotruk Chengdu Wangpai Commercial Vehicle Co., Ltd.
|-
| LJW || JMC Landwind
|-
| LJX || JMC Ford
|-
| LJ1 || JAC (JAC, Sehol)
|-
| LJ1 || Nio, Inc.
|-
| LJ4 || Shanghai Jmstar Motorcycle Co., Ltd.
|-
| LJ5 || Cixi Kingring Motorcycle Co., Ltd. (Jinlun)
|-
| LJ8 || Zotye Auto made by Jiangnan Automobile
|-
| LKC || BAIC commercial vehicles, previously Changhe
|-
| LKG || Youngman Lotus Automobile Co., Ltd.
|-
| LKH || Hafei Motor
|-
| LKL || Higer Bus
|-
| LKT || Yunnan Lifan Junma Vehicle Co., Ltd. commercial vehicles
|-
| LK2 || Anhui JAC Bus
|-
| LK6 || SAIC-GM-Wuling (Wuling, Baojun) microcars and other vehicles
|-
| LK8 || Zhejiang Yule New Energy Automobile Technology Co., Ltd. (ATV)
|-
| LLC || Loncin Motor Co., Ltd. (motorcycle)
|-
| LLJ || Jiangsu Xinling Motorcycle Fabricate Co., Ltd.
|-
| LLN || Qoros
|-
| LLP || Zhejiang Jiajue Motorcycle Manufacturing Co., Ltd.
|-
| LLU || Dongfeng Fengxing Jingyi
|-
| LLV || Lifan, Maple (owned by Geely), Livan Automotive
|-
| LLX || Yudo Auto
|-
| LL0 || Sanmen County Yongfu Machine Co., Ltd. (motorcycles)
|-
| LL2 || WM Motor Technology Co., Ltd. (Weltmeister)
|-
| LL3 || Xiamen Golden Dragon Bus Co. Ltd.
|-
| LL6 || GAC Mitsubishi Motors Co., Ltd. (formerly Hunan Changfeng)
|-
| LL8 || Jiangsu Linhai Yamaha Motor Co., Ltd.
|-
| LMC || Suzuki Hong Kong (motorcycles)
|-
| LME || Skyworth (formerly Skywell), Elaris Beo
|-
| LMF || Jiangmen Zhongyu Motor Co., Ltd.
|-
| LMG || GAC Motor, Trumpchi, [[w:Dodge Attitude#Fourth generation (2025)|Dodge Attitude made by GAC]]
|-
| LMH || Jiangsu Guowei Motor Co., Ltd. (Motoleader)
|-
| LMP || Farizon Auto (Geely Sichuan Commercial Vehicle Co., Ltd.)
|-
| LMV || Haima Car Co., Ltd.
|-
| LMV || XPeng Motors G3 (not G3i) made by Haima
|-
| LMW || GAC Group, [[w:Trumpchi GS5#Dodge Journey|Dodge Journey made by GAC]]
|-
| LMX || Forthing (Dongfeng Fengxing)
|-
| LM0 || Wangye Holdings Co., Ltd. (motorcycles)
|-
| LM6 || SWM (automobiles)
|-
| LM8 || Seres (formerly SF Motors), AITO
|-
| LNA || GAC Aion New Energy Automobile Co., Ltd., Hycan
|-
| LNB || BAIC Motor (Senova, Weiwang, Huansu) & Arcfox & Xiaomi SU7 built by BAIC
|-
| LND || JMEV (Jiangxi Jiangling Group New Energy Vehicle Co., Ltd.), Eveasy/Mobilize Limo
|-
| LNE || Zhejiang CRRC Electric Vehicle Co., Ltd. (bus)
|-
| LNP || NAC MG UK Limited & Nanjing Fiat Automobile
|-
| LNN || Chery Automobile, Omoda, Jaecoo
|-
| LNV || Naveco (Nanjing Iveco Automobile Co. Ltd.)
|-
| LNX || Dongfeng Liuzhou Motor (Chenglong trucks)
|-
| LNY || Yuejin
|-
| LPA || Changan PSA (DS Automobiles)
|-
| LPE || BYD Auto
|-
| LPS || Polestar
|-
| LP6 || Guangzhou Panyu Haojian Motorcycle Industry Co., Ltd.
|-
| LRB || SAIC-General Motors (Buick for export)
|-
| LRD || Beijing Foton Daimler Automotive Co., Ltd. Auman trucks
|-
| LRE || SAIC-General Motors (Cadillac for export)
|-
| LRP || Chongqing Rato Power Co. Ltd. (Asus)
|-
| LRR || Ningbo Longjia Power Technology Co., Ltd. (motorcycles)
|-
| LRW || Tesla, Inc. (Gigafactory Shanghai)
|-
| LR4 || Yadi Technology Group
|-
| LR6 || Guangzhou Dayun Vehicle Co., Ltd.
|-
| LSC || Changan Automobile (light truck)
|-
| LSF || SAIC Maxus or LDV pickup/SUV & Chevrolet S10 Max & Shanghai Sunwin Bus Corporation
|-
| LSG || SAIC-General Motors (For China: Chevrolet, Buick, Cadillac, Sail Springo, For export: Chevrolet)
|-
| LSH || SAIC Maxus van or LDV van & Chevrolet Express Max
|-
| LSJ || SAIC MG & SAIC Roewe & IM Motors & Rising Auto
|-
| LSK || SAIC Maxus or LDV van
|-
| LSV || SAIC-Volkswagen (VW, Skoda, Audi, Tantus)
|-
| LSY || Brilliance (Jinbei, Zhonghua) & Jinbei GM
|-
| LS3 || Hejia New Energy Vehicle Co., Ltd
|-
| LS4 || Changan Automobile (MPV/SUV)
|-
| LS5 || Changan Automobile (car) & Changan Suzuki
|-
| LS6 || Changan Automobile & Deepal Automobile & Avatr
|-
| LS7 || JMC Heavy Duty Truck Co., Ltd.
|-
| LS8 ||Henan Shaolin Auto Co., Ltd. (bus)
|-
| LTA || ZX Auto
|-
| LTN || Soueast-built Chrysler & Dodge vehicles
|-
| LTP || National Electric Vehicle Sweden AB (NEVS)
|-
| LTV || FAW [[../Toyota/VIN Codes|Toyota]] (Tianjin)
|-
| LTW || Zhejiang Dianka Automobile Technology Co. Ltd. (Enovate)
|-
| LT1 || Yangzhou Tonghua Semi-Trailer Co., Ltd. (truck trailer)
|-
| LUC || [[../Honda/VIN Codes|Honda]] Automobile (China)
|-
| LUD || Dongfeng Nissan Diesel Motor Co Ltd.
|-
| LUG || Qiantu Motor
|-
| LUJ || Zhejiang Shanqi Tianying Vehicle Industry Co., Ltd. (motorcycles)
|-
| LUR || Chery Automobile, iCar
|-
| LUX || Dongfeng Yulon Motor Co. Ltd.
|-
| LUZ || Hozon Auto New Energy Automobile Co., Ltd. (Neta)
|-
| LVA || Foton Motor
|-
| LVB || Foton Motor truck
|-
| LVC || Foton Motor bus
|-
| LVF || Changhe Suzuki
|-
| LVG || GAC Toyota (Toyota, Leahead)
|-
| LVH || Dongfeng Honda (Honda, Ciimo)
|-
| LVM || Chery Commercial Vehicle
|-
| LVP || Dongfeng Sokon Motor Company (DFSK)
|-
| LVR || Changan Mazda
|-
| LVS || Changan [[../Ford/VIN Codes|Ford]] (Ford, Lincoln) & Changan Ford Mazda & Volvo S40 and S80L made by Changan Ford Mazda
|-
| LVT || Chery Automobile, Exeed, Jetour, Soueast
|-
| LVU || Chery Automobile, Jetour
|-
| LVV || Chery Automobile, Omoda, Jaecoo
|-
| LVX || Landwind, JMC (discontinued in 2021)
|-
| LVX || Aiways Automobiles Company Ltd
|-
| LVY || Volvo Cars Daqing factory
|-
| LVZ || Dongfeng Sokon Motor Company (DFSK)
|-
| LV3 || Hengchi Automobile (Evergrande Group)
|-
| LV7 || Jinan Qingqi Motorcycle
|-
| LWB || Wuyang Honda Motorcycle (Guangzhou) Co., Ltd.
|-
| LWE || Yangtse Motor Group (bus)
|-
| LWG || Chongqing Huansong Industries (Group) Co., Ltd.
|-
| LWL || Qingling Isuzu
|-
| LWM || Chongqing Wonjan Motorcycle Co., Ltd.
|-
| LWV || GAC Fiat Chrysler Automobiles (Fiat, Jeep)
|-
| LWX || Shanghai Wanxiang Automobile Manufacturing Co., Ltd. (bus)
|-
| LW4 || Li Auto
|-
| LXA || Jiangmen Qipai Motorcycle Co., Ltd.
|-
| LXD || Ningbo Dongfang Lingyun Vehicle Made Co., Ltd. (motorcycle)
|-
| LXG || Xuzhou Construction Machinery Group Co., Ltd. (XCMG)
|-
| LXK || Shanghai Meitian Motorcycle Co., Ltd.
|-
| LXM || Xiamen Xiashing Motorcycle Co., Ltd. (SYM)
|-
| LXN || Link Tour
|-
| LXV || Beijing Borgward Automotive Co., Ltd.
|-
| LXW || JMC - Ford
|-
| LXY || Chongqing Shineray Motorcycle Co., Ltd.
|-
| LX6 || Jiangmen City Huari Group Co. Ltd. (motorcycle)
|-
| LX8 || Chongqing Xgjao (Xinganjue) Motorcycle Co Ltd.
|-
| LYB || Weichai (Yangzhou) Yaxing Automobile Co., Ltd.
|-
| LYD || Taizhou City Kaitong Motorcycle Co., Ltd. (motorcycle)
|-
| LYJ || Beijing ZhongdaYanjing Auto Co., Ltd. (bus)
|-
| LYM || Zhuzhou Jianshe Yamaha Motorcycle Co., Ltd.
|-
| LYS || Nanjing Vmoto Manufacturing Co. Ltd. (motorcycle)
|-
| LYU || Huansu (BAIC Motor & Yinxiang Group)
|-
| LYV || Volvo Cars Chengdu factory & Taizhou, Luqiao District factory
|-
| LY4 || Chongqing Yingang Science & Technology Group Co., Ltd. (motorcycle)
|-
| LZE || Isuzu Guangzhou, China
|-
| LZF || SAIC Iveco Hongyan (-2021), SAIC Hongyan (2021-)
|-
| LZG || Shaanxi Automobile Group (Shacman)
|-
| LZK || Sinotruk (CNHTC) Huanghe bus
|-
| LZL || Zengcheng Haili Motorcycle Ltd.
|-
| LZM || MAN China
|-
| LZP || Zhongshan Guochi Motorcycle (Baotian)
|-
| LZS || Zongshen, Electra Meccanica Vehicles Corp. (Solo) made by Zongshen
|-
| LZU || Guangzhou Isuzu Bus
|-
| LZW || SAIC-GM-Wuling (Wuling, Baojun, Chevrolet [for export])
|-
| LZY || Yutong Bus Co., Ltd.
|-
| LZZ || Sinotruk (CNHTC) (Howo, Sitrak)
|-
| LZ0 || Shandong Wuzheng Group Co., Ltd.
|-
| LZ4 || Jiangsu Linzhi Shangyang Group Co Ltd.
|-
| LZ9/LZX || Raysince
|-
| L0N || Ezytrail (camper trailers)
|-
| L08 || Zhejiang Apollo Sports Technology Co., Ltd. (motorcycles)
|-
| L1K || Chongqing Hengtong Bus Co., Ltd.
|-
| L1N || XPeng Motors
|-
| L10 || Geely Emgrand
|-
| L2B || Jiangsu Baodiao Locomotive Co., Ltd. (motorcycles)
|-
| L2C || Chery Jaguar Land Rover
|-
| L3H || Shanxi Victory Automobile Manufacturing Co., Ltd.
|-
| L37 || Huzhou Daixi Zhenhua Technology Trade Co., Ltd. (motorcycles)
|-
| L4B || Xingyue Group (motorcycles)
|-
| L4F || Suzhou Eagle Electric Vehicle Manufacturing Co., Ltd.
|-
| L4H || Ningbo Longjia Motorcycle Co., Ltd.
|-
| L4S || Zhejiang Xingyue Vehicle Co Ltd. (motorcycles)
|-
| L4Y || Qingqi Group Ningbo Rhon Motorcycle / Ningbo Dalong Smooth Locomotive Industry Co., Ltd.
|-
| L5C || Zhejiang Kangdi Vehicles Co., Ltd. (motorcycles, ATVs)
|-
| L5E || Zoomlion Heavy Industry Science & Technology Co., Ltd.
|-
| L5K || Zhejiang Yongkang Easy Vehicle
|-
| L5N || Zhejiang Taotao (ATV & motorcycles)
|-
| L5R || Jiangsu Dafier Motorcycle Co., Ltd. (motorcycles)
|-
| L5Y || Taizhou Zhongneng Motorcycle Co. Ltd. (Znen)
|-
| L6F || Shandong Liangzi Power Co. Ltd.
|-
| L6J || Zhejiang Kayo Motor Co. Ltd. (ATV)
|-
| L6K || Shanghai Howhit Machinery Manufacture Co. Ltd.
|-
| L6T || Geely, Lynk & Co, Zeekr
|-
| L66 || Zhuhai Granton Bus and Coach Co. Ltd.
|-
| L82 || Baotian
|-
| L85 || Zhejiang Yongkang Huabao Electric Appliance
|-
| L8A || Jinhua Youngman Automobile Manufacturing Co., Ltd.
|-
| L8X || Zhejiang Summit Huawin Motorcycle
|-
| L8Y || Zhejiang Jonway Motorcycle Manufacturing Co., Ltd.
|-
| L9G || Zhuhai Guangtong Automobile Co., Ltd. (bus)
|-
| L9N || Zhejiang Taotao Vehicles Co., Ltd.
|-
| MAA || India Kawasaki Motors Pvt. Ltd.
|-
| MAB || Mahindra & Mahindra
|-
| MAC || Mahindra & Mahindra
|-
| MAH || Fiat India Automobiles Pvt. Ltd
|-
| MAJ || [[../Ford/VIN Codes|Ford]] India
|-
| MAK || [[../Honda/VIN Codes|Honda]] Cars India
|-
| MAL || Hyundai Motor India
|-
| MAN || Eicher Polaris Multix
|-
| MAT || Tata Motors, Rover CityRover
|-
| MA1 || Mahindra & Mahindra
|-
| MA3 || Maruti Suzuki India (domestic & export)
|-
| MA6 || GM India
|-
| MA7 || Hindustan Motors Ltd. & Mitsubishi Motors & Isuzu models made by Hindustan Motors
|-
| MA8 || Daewoo Motor India
|-
| MBF || Royal Enfield
|-
| MBH || Suzuki (for export) & Nissan Pixo made by Maruti Suzuki India Limited
|-
| MBJ || [[../Toyota/VIN Codes|Toyota]] Kirloskar Motor Pvt. Ltd.
|-
| MBK || MAN Trucks India Pvt. Ltd.
|-
| MBL || Hero MotoCorp
|-
| MBR || Mercedes-Benz India
|-
| MBU || Swaraj Vehicles Limited
|-
| MBV || Premier Automobiles Ltd.
|-
| MBX || Piaggio India (Piaggio Ape)
|-
| MBY || Asia Motor Works Ltd.
|-
| MB1 || Ashok Leyland
|-
| MB2 || Hyundai Motor India (SUV)
|-
| MB7 || Reva Electric Car Company/Mahindra Reva Electric Vehicles Pvt. Ltd.
|-
| MB8 || Suzuki Motorcycle India Limited
|-
| MCA || FCA India Automobiles Pvt. Ltd. (Fiat, Jeep)
|-
| MCB || GM India
|-
| MCD || Mahindra Two Wheelers
|-
| MCG || Atul Auto Ltd.
|-
| MCL || International Cars And Motors Ltd.
|-
| MC1 || Force Motors Ltd.
|-
| MC2 || Eicher Motors Ltd./Volvo Eicher Commercial Vehicles Ltd.
|-
| MC4 || Dilip Chhabria Design Pvt Ltd.
|-
| MC9/RE1 || Reva Electric Car Company (Reva G-Wiz)
|-
| MDE || Kinetic Engineering Limited
|-
| MDH || Nissan Motor India Pvt Ltd. (including Datsun)
|-
| MDT || Kerala Automobiles Limited
|-
| MD2 || Bajaj Auto Ltd. & KTM and Husqvarna motorcycles built by Bajaj & Indian-market Triumph motorcycles built by Bajaj
|-
| MD6 || TVS Motor Company
|-
| MD7 || LML Ltd including Genuine Scooter Company Stella
|-
| MD9 || Shuttle Cars India
|-
| MEC || Daimler India Commercial Vehicles (BharatBenz)
|-
| MEE || Renault India Private Limited
|-
| MEG || Harley-Davidson India
|-
| MER || Benelli India
|-
| MES || Mahindra Navistar
|-
| MET || Piaggio India (Vespa, Indian-market Aprilia)
|-
| MEX || Škoda Auto Volkswagen India Pvt. Ltd. 2015 on
|-
| ME1 || India Yamaha Motor Pvt. Ltd.
|-
| ME3 || Royal Enfield
|-
| ME4 || Honda Motorcycle and Scooter India
|-
| MYH || Ather Energy
|-
| MZB || Kia India Pvt. Ltd.
|-
| MZD || Classic Legends Private Limited – Jawa
|-
| MZZ || Citroen India (PCA Automobiles India Private Limited)
|-
| MZ7 || MG Motor India Pvt. Ltd.
|-
| M3G || Isuzu Motors India
|-
| M6F || UM Lohia Two Wheelers Private Limited
|-
| ME9/ || BUYMYEV TECHNOLOGY PVT. LTD. (Indibike)
|-
| MF3 || PT Hyundai Motor Manufacturing Indonesia
|-
| MHB || PT Nissan Motor Indonesia
|-
| MHD || PT Indomobil Suzuki International
|-
| MHF || PT [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing Indonesia
|-
| MHK || PT Astra Daihatsu Motor (includes Toyotas made by Astra Daihatsu)
|-
| MHL || PT Mercedes-Benz Indonesia
|-
| MHR || [[../Honda/VIN Codes|Honda]] Indonesia (PT Honda Prospect Motor) (car)
|-
| MHY || PT Suzuki Indomobil Motor (car, MPV, van)
|-
| MH1 || PT Astra Honda Motor (motorcycle)
|-
| MH3 || PT Yamaha Indonesia Motor Mfg.
|-
| MH4 || PT Kawasaki Motor Indonesia
|-
| MH8 || PT Suzuki Indomobil Motor (motorcycle)
|-
| MJB || GM Indonesia
|-
| MKF || PT Sokonindo Automobile (DFSK)
|-
| MK2 || PT Mitsubishi Motors Krama Yudha Indonesia
|-
| MK3 || PT SGMW Motor Indonesia (Wuling)
|-
| MLB || Siam Yamaha Co Ltd.
|-
| MLC || Thai Suzuki Motor Co., Ltd. (motorcycle)
|-
| MLE || Thai Yamaha Motor Co., Ltd.
|-
| MLH || Thai [[../Honda/VIN Codes|Honda]] Manufacturing Co., Ltd. (motorcycle)
|-
| MLW || Sco Motor Co., Ltd. (motorcycle)
|-
| MLY || Harley-Davidson Thailand
|-
| ML0 || Ducati Motor (Thailand) Co., Ltd.
|-
| ML3 || Mitsubishi Motors, Dodge Colt 100 [Canada], [[w:Dodge Attitude#Third generation (A10; 2015)|Dodge Attitude]] [Mexico] made by Mitsubishi (Thailand)
|-
| ML5 || Kawasaki Motors Enterprise Co. Ltd. (Thailand)
|-
| MMA || Mitsubishi Motors (Thailand)
|-
| MMB || Mitsubishi Motors (Thailand)
|-
| MMC || Mitsubishi Motors (Thailand)
|-
| MMD || Mitsubishi Motors (Thailand)
|-
| MME || Mitsubishi Motors (Thailand)
|-
| MMF || BMW Manufacturing (Thailand) Co., Ltd.
|-
| MML || MG Thailand (SAIC-CP)
|-
| MMM || Chevrolet Thailand, Holden Colorado RC pickup
|-
| MMR || Subaru/Tan Chong Subaru Automotive (Thailand) Co. Ltd.
|-
| MMS || Suzuki Motor (Thailand) Co., Ltd. (passenger car)
|-
| MMT || Mitsubishi Motors (Thailand)
|-
| MMU || Holden Thailand (Colorado RG, Colorado 7, & Trailblazer)
|-
| MM0, MM6, MM7, MM8 || Mazda Thailand (Ford-Mazda AutoAlliance Thailand plant)
|-
| MNA || [[../Ford/VIN Codes|Ford]] Thailand (Ford-Mazda AutoAlliance Thailand plant) for Australia/New Zealand export
|-
| MNB || [[../Ford/VIN Codes|Ford]] Thailand (Ford-Mazda AutoAlliance Thailand plant) for other right-hand drive markets
|-
| MNC || [[../Ford/VIN Codes|Ford]] Thailand (Ford-Mazda AutoAlliance Thailand plant) for left-hand drive markets
|-
| MNK || Hino Motors Manufacturing Thailand Co Ltd.
|-
| MNT || Nissan Motor (Thailand) Co., Ltd.
|-
| MNU || Great Wall Motor Manufacturing (Thailand) Co., Ltd.
|-
| MN3 || Eagle Vista [Canada] made by Mitsubishi (Thailand)
|-
| MPA || Isuzu Motors (Thailand) Co., Ltd. & Holden Rodeo RA pickup made by Isuzu in Thailand
|-
| MPB || [[../Ford/VIN Codes|Ford]] Thailand (Ford Thailand Manufacturing plant)
|-
| MP1 || Isuzu Motors (Thailand) Co., Ltd.
|-
| MP2 || Mazda BT-50 pickup built by Isuzu Motors (Thailand) Co., Ltd.
|-
| MP3 || Plymouth Colt 100 [Canada] made by Mitsubishi (Thailand)
|-
| MP5 || Foton Motor Thailand
|-
| MRH || [[../Honda/VIN Codes|Honda]] Thailand (car)
|-
| MRT || Neta (Hozon Auto) made by Bangchan General Assembly Co., Ltd.
|-
| MR0 || [[../Toyota/VIN Codes|Toyota]] Thailand (pickups & Fortuner SUV)
|-
| MR1 || [[../Toyota/VIN Codes|Toyota]] Thailand
|-
| MR2 || [[../Toyota/VIN Codes|Toyota]] Thailand (Gateway plant) (passenger cars & CUVs)
|-
| MR3 || [[../Toyota/VIN Codes|Toyota]] Thailand (Hilux Champ chassis cab)
|-
| MS0 || [[../SUPER SEVEN STARS MOTORS INDUSTRY CO.,LTD/VIN Codes|Super Seven Stars Motors]] Myanmar
|-
| MS1 || [[../SUPER SEVEN STARS AUTOMOTIVE CO.,LTD/VIN Codes|Super Seven Stars Automotive]] Myanmar
|-
| MS3 || Suzuki Myanmar Motor Co., Ltd.
|-
| MXB || Saryarka AvtoProm bus (Kazakhstan)
|-
| MXL || Yutong bus made by Qaz Tehna (Kazakhstan)
|-
| MXV || IMZ-Ural Ural Motorcycles (Kazakhstan)
|-
| MX3 || Hyundai Trans Auto (Kazakhstan)
|-
| NAA || Iran Khodro (Peugeot Iran)
|-
| NAC || Mammut (truck trailers)
|-
| NAD || Škoda
|-
| NAL || Maral Sanat Jarvid (truck trailers)
|-
| NAP || Pars Khodro
|-
| NAS || SAIPA
|-
| NC0 || Oghab Afshan (bus)
|-
| NC9/ || VIRA Diesel
|-
| ND9/345 || Oghab Afshan (bus)
|-
| NFB || Honda Atlas Cars Pakistan Ltd.
|-
| NG3 || Lucky Motor Corporation
|-
| NLA || Honda Turkiye A.S. cars
|-
| NLC || Askam Kamyon Imalat Ve Ticaret A.S.
|-
| NLE || Mercedes-Benz Türk A.S. Truck
|-
| NLF || Koluman Otomotiv Endustri A.S. (truck trailer)
|-
| NLH || [[../Hyundai/VIN Codes|Hyundai]] Assan Otomotiv car/SUV
|-
| NLJ || [[../Hyundai/VIN Codes|Hyundai]] Assan Otomotiv van
|-
| NLN || Karsan
|-
| NLR || Otokar
|-
| NLT || Temsa
|-
| NLZ || Tezeller
|-
| NL1 || TOGG
|-
| NL2 || HABAS/HBS (bus)
|-
| NMA || MAN Türkiye A.Ş.
|-
| NMB || Mercedes-Benz Türk A.S. Buses
|-
| NMC || BMC Otomotiv Sanayi ve Ticaret A.Ş.
|-
| NMH || Honda Anadolu motorcycle
|-
| NMS || Otoyol San. A.Ş.
|-
| NMT || [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing Turkey
|-
| NM0 || Ford Otosan
|-
| NM1 || Oyak Renault Otomobil Fabrikaları A.Ş.
|-
| NM4 || Tofaş (Turk Otomobil Fabrikasi AS)
|-
| NNA || Anadolu Isuzu
|-
| NNN || Gépébus Oréos 4X (based on Otokar Vectio)
|-
| NNY || Yeksan (truck trailer)
|-
| NPM || Seyit Usta Treyler (truck trailer)
|-
| NPR || Oztreyler (truck trailer)
|-
| NPS || Nursan (truck trailer)
|-
| NP8|| ÖZGÜL TREYLER (truck trailer)
|-
| NP9/002 || OKT Trailer (truck trailer)
|-
| NP9/003 || Aksoylu Trailer (truck trailer)
|-
| NP9/011 || Güleryüz (bus)
|-
| NP9/021 || Dogumak (truck trailer)
|-
| NP9/022 || Alim (truck trailer)
|-
| NP9/042 || Ali Rıza Usta (truck trailer)
|-
| NP9/066 || Makinsan (truck trailer)
|-
| NP9/093 || BRF Trailer (truck trailer)
|-
| NP9/103 || Türkkar (bus)
|-
| NP9/106 || Çarsan Treyler (truck trailer)
|-
| NP9/107 || Arbus Perfect (bus)
|-
| NP9/108 || Guven Makina (truck trailer)
|-
| NP9/117 || Katmerciler (truck trailer)
|-
| NP9/300 || TCV (bus)
|-
| NP9/258 || Ceytrayler (truck trailer)
|-
| NP9/306 || Cryocan (truck trailer)
|-
| NRE || Bozankaya
|-
| NRX || Musoshi
|-
| NRY || Pilotcar Otomotiv
|-
| NR9/012 || Doğan Yıldız (truck trailer)
|-
| NR9/028 || Micansan (truck trailer)
|-
| NR9/029 || Yilteks (truck trailer)
|-
| NR9/034 || Akia (bus)
|-
| NR9/084 || Harsan (truck trailer)
|-
| NR9/257 || Vega Trailer (truck trailer)
|-
| NSA || SamAvto / SAZ (Uzbekistan)
|-
| NS2 || JV MAN Auto - Uzbekistan
|-
| NVA || Khazar (IKCO Dena made in Azerbaijan)
|-
| PAB || Isuzu Philippines Corporation
|-
| PAD || Honda Cars Philippines
|-
| PE1 || Ford Motor Company Philippines
|-
| PE3 || Mazda Philippines made by Ford Motor Company Philippines
|-
| PFD || Hyundai Motor Group Innovation Center in Singapore (HMGICS)
|-
| PL1 || Proton, Malaysia
|-
| PL8 || Inokom-Hyundai
|-
| PLP || Subaru/Tan Chong Motor Assemblies, Malaysia
|-
| PLZ || Isuzu Malaysia
|-
| PMA || MAN Truck & Bus Malaysia
|-
| PMH || Honda Malaysia (car)
|-
| PMK || Honda Boon Siew (motorcycle)
|-
| PML || Hicom
|-
| PMN || Modenas
|-
| PMS || Suzuki Assemblers Malaysia (motorcycle)
|-
| PMV || Hong Leong Yamaha Motor Sdn. Bhd.
|-
| PMY || Hong Leong Yamaha Motor Sdn. Bhd.
|-
| PM1 || BMW & Mini/Inokom
|-
| PM2 || Perodua
|-
| PM9/ || Bufori
|-
| PNA || Naza/Kia/Peugeot
|-
| PNA || Stellantis Gurun (Malaysia) Sdn. Bhd. (Peugeot)
|-
| PNS || SKSBUS Malaysia (bus)
|-
| PNS || TMSBUS Malaysia (bus)
|-
| PNV || Volvo Car Manufacturing Malaysia
|-
| PN1 || UMW Toyota Motor - Assembly Services Sdn. Bhd. (ASSB)
|-
| PN2 || UMW Toyota Motor - Assembly Services Sdn. Bhd. (ASSB)
|-
| PN8 || Nissan/Tan Chong Motor Assemblies, Malaysia
|-
| PPP || Suzuki
|-
| PPV || Volkswagen/HICOM Automotive Manufacturers (Malaysia)
|-
| PP1 || Mazda/Inokom
|-
| PP3 || Hyundai/Inokom
|-
| PRA || Sinotruk
|-
| PRH || Chery (by Chery Alado Holdings [joint venture] at Oriental Assemblers plant)
|-
| PRX || Kia/Inokom
|-
| PR8 || Ford
|-
| PRN || GAC Trumpchi made by Warisan Tan Chong Automotif Malaysia
|-
| PV3 || Ford made by RMA Automotive Cambodia
|-
| RA1 || Steyr Trucks International FZE, UAE
|-
| RA9/015 || Al-Assri Industries (Trailers), UAE
|-
| LES || Isuzu MPV made by Sanfu Motor Industrial Co., Ltd. (Trooper '87-'91) (Taiwan)
|-
| LFA || Ford Lio Ho Motor Co Ltd. old designation (Taiwan)
|-
| LM1 || Tai Ling Motor Co Ltd. old designation (Suzuki motorcycle made by Tai Ling) (Taiwan)
|-
| LM4 || Tai Ling Motor Co Ltd. old designation (Suzuki ATV made by Tai Ling) (Taiwan)
|-
| LM5 || Isuzu Truck (Light Duty) made by Sanfu Motor Industrial Co., Ltd. (Trooper '87-'88) (Taiwan)
|-
| LN1 || Tai Ling Motor Co Ltd. old designation (Suzuki motorcycle made by Tai Ling) (Taiwan)
|-
| LPR || Yamaha Motor Taiwan Co. Ltd. old designation (Taiwan)
|-
| RFB || Kwang Yang Motor Co., Ltd. (Kymco), Taiwan
|-
| RFC || Taiwan Golden Bee
|-
| RFD || Tai Ling Motor Co Ltd. new designation (Taiwan)
|-
| RFG || Sanyang Motor Co., Ltd. (SYM) Taiwan
|-
| RFL || Her Chee Industrial Co., Ltd. (Adly), Taiwan
|-
| RFT || CPI Motor Company, Taiwan
|-
| RFV || Motive Power Industry Co., Ltd. (PGO Scooters including Genuine Scooter Company models made by PGO) (Taiwan)
|-
| RF3 || Aeon Motor Co., Ltd., Taiwan
|-
| RF5 || Yulon Motor Co. Ltd., Taiwan (Luxgen)
|-
| RF8 || EVT Technology Co., Ltd (motorcycle)
|-
| RGS || Kawasaki made by Kymco (Taiwan)
|-
| RHA || Ford Lio Ho Motor Co Ltd. new designation (Taiwan)
|-
| RKJ || Prince Motors Taiwan
|-
| RKL || Kuozui Motors (Toyota) (Taiwan)
|-
| RKM || China Motor Corporation (Taiwan)
|-
| RKR || Yamaha Motor Taiwan Co. Ltd. new designation
|-
| RKT || Access Motor Co., Ltd. (Taiwan)
|-
| RK3 || E-Ton Power Tech Co., Ltd. (motorcycle) (Taiwan)
|-
| RK3 || Honda Taiwan
|-
| RK7 || Kawasaki ATV made by Tai Ling Motor Co Ltd (rebadged Suzuki ATV) new designation (Taiwan)
|-
| RLA || Vina Star Motors Corp. – Mitsubishi (Vietnam)
|-
| RLC || Yamaha Motor Vietnam Co. Ltd.
|-
| RLE || Isuzu Vietnam Co.
|-
| RLH || Honda Vietnam Co. Ltd.
|-
| RLL || VinFast SUV
|-
| RLM || Mercedes-Benz Vietnam
|-
| RLN || VinFast
|-
| RLV || Vietnam Precision Industrial CO., Ltd. (Can-Am DS 70 & DS 90)
|-
| RL0 || Ford Vietnam
|-
| RL4 || Toyota Motor Vietnam
|-
| RP8 || Piaggio Vietnam Co. Ltd.
|-
| RUN || Sollets-Auto ST6 (Russia)
|-
| R1J || Jiayuan Power (Hong Kong) Ltd. (Electric Low-Speed Vehicles) (Hong Kong)
|-
| R1N || Niu Technologies Group Ltd. (Hong Kong)
|-
| R10 || ZAP (HK) Co. Ltd.
|-
| R19/003 || GMI (bus) (Hong Kong)
|-
| R2P || Evoke Electric Motorcycles (Hong Kong)
|-
| R3M || Mangosteen Technology Co., Ltd. (Hong Kong)
|-
| R36 || HK Shansu Technology Co., Ltd. (Hong Kong)
|-
| R4N || Elyx Smart Technology Holdings (Hong Kong) Ltd.
|-
| R82 || Hangzhou Lantu Technology Co., Ltd. (Hong Kong)
|-
| SAA || Austin
|-
| SAB || Optare (1985-2020), Switch Mobility (2021-)
|-
| SAD || Daimler Company Limited (until April 1987)
|-
| SAD || Jaguar SUV (E-Pace, F-Pace, I-Pace)
|-
| SAF || ERF trucks
|-
| SAH || Honda made by Austin Rover Group
|-
| SAJ || Jaguar passenger car & Daimler passenger car (after April 1987)
|-
| SAL || [[../Land Rover/VIN Codes|Land Rover]]
|-
| SAM || Morris
|-
| SAR || Rover & MG Rover Group
|-
| SAT || Triumph car
|-
| SAX || Austin-Rover Group including Sterling Cars
|-
| SAY || Norton Motorcycles (UK) Ltd. (Donington Park/Donington Hall)
|-
| SAZ || Freight Rover
|-
| SA3 || Ginetta Cars
|-
| SA9/ || OX Global
|-
| SA9/A11 || Morgan Roadster (V6) (USA)
|-
| SA9/J00 || Morgan Aero 8 (USA)
|-
| SA9/004 || Morgan (4-wheel passenger cars)
|-
| SA9/005 || Panther
|-
| SA9/010 || Invicta S1
|-
| SA9/011 || Midas Cars
|-
| SA9/019 || TVR
|-
| SA9/022 || Triking Sports Cars
|-
| SA9/026 || Fleur de Lys
|-
| SA9/036 || Ginetta Cars
|-
| SA9/038 || DAX Cars
|-
| SA9/039 || Westfield Sportscars
|-
| SA9/048 || McLaren F1
|-
| SA9/050 || Marcos Engineering
|-
| SA9/062 || AC Cars (Brooklands Ace)
|-
| SA9/068 || Johnston Sweepers
|-
| SA9/073 || Tomita Auto UK (Tommykaira ZZ)
|-
| SA9/074 || Ascari
|-
| SA9/088 || Spectre Angel
|-
| SA9/105 || Mosler Europe Ltd.
|-
| SA9/113 || Noble
|-
| SA9/130 || MG Sport and Racing
|-
| SA9/141 || Wrightbus
|-
| SA9/202 || Morgan 3-Wheeler, Super 3
|-
| SA9/207 || Radical Sportscars
|-
| SA9/211 || BAC (Briggs Automotive Company Ltd.)
|-
| SA9/225 || Paneltex (truck trailer)
|-
| SA9/231 || Peel Engineering
|-
| SA9/337 || Ariel
|-
| SA9/341 || Zenos
|-
| SA9/438 || Charge Cars
|-
| SA9/458 || Gordon Murray Automotive
|-
| SA9/474 || Mellor (bus)
|-
| SA9/612 || Tiger Racing (kit car)
|-
| SA9/621 || AC Cars (Ace)
|-
| SBB || Leyland Vehicles
|-
| SBC || Iveco Ford Truck
|-
| SBF || Nugent (trailer)
|-
| SBJ || Leyland Bus
|-
| SBL || Leyland Motors & Leyland DAF
|-
| SBM || McLaren
|-
| SBS || Scammell
|-
| SBU || United Trailers (truck trailer)
|-
| SBV || Kenworth & Peterbilt [incomplete vehicle] made by Leyland Trucks
|-
| SBW || Weightlifter Bodies (truck trailer)
|-
| SB1 || [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing UK
|-
| SCA || Rolls Royce passenger car
|-
| SCB || Bentley passenger car
|-
| SCC || Lotus Cars & Opel Lotus Omega/Vauxhall Lotus Carlton
|-
| SCD || Reliant Motors
|-
| SCE || DeLorean Motor Cars N. Ireland (UK)
|-
| SCF || Aston Martin Lagonda Ltd. passenger car & '21 DBX SUV
|-
| SCG || Triumph Engineering Co. Ltd. (original Triumph Motorcycle company)
|-
| SCK || Ifor Williams Trailers
|-
| SCM || Manitowoc Cranes - Grove
|-
| SCR || London Electric Vehicle Company & London Taxi Company & London Taxis International
|-
| SCV || Volvo Truck & Bus Scotland
|-
| SC5 || Wrightbus (from ~2020)
|-
| SC6 || INEOS Automotive SUV
|-
| SDB || Talbot
|-
| SDC || SDC Trailers Ltd. (truck trailer)
|-
| SDF || Dodge Trucks – UK 1981–1984
|-
| SDG || Renault Trucks Industries 1985–1992
|-
| SDK || Caterham Cars
|-
| SDL || TVR
|-
| SDP || NAC MG UK & MG Motor UK Ltd.
|-
| SDU || Utility (truck trailer)
|-
| SD7 || Aston Martin SUV
|-
| SD8 || Moke International Ltd.
|-
| SED || IBC Vehicles (General Motors Luton Plant) (Opel/Vauxhall, 1st gen. Holden Frontera, Isuzu Midi)
|-
| SEG || Dennis Eagle Ltd., including Renault Trucks Access and D Access
|-
| SEP || Don-Bur (truck trailer)
|-
| SEY || LDV Group Ltd.
|-
| SFA || [[../Ford/VIN Codes|Ford]] UK
|-
| SFD || Dennis UK / Alexander Dennis
|-
| SFE || Alexander Dennis UK
|-
| SFR || Fruehauf (truck trailer)
|-
| SFN || Foden Trucks & Kenworth [truck] made by Foden Trucks
|-
| SFZ || Tesla Roadster made by Lotus
|-
| SGA || Avondale (caravans)
|-
| SGB || Bailey (caravans)
|-
| SGD || Swift Group Ltd. (caravans)
|-
| SGE || Elddis (caravans)
|-
| SGL || Lunar Caravans Ltd.
|-
| SG4 || Coachman Caravan Co. Ltd.
|-
| SG7 || ABI Caravans Ltd.
|-
| SHH || [[../Honda/VIN Codes|Honda]] UK passenger car
|-
| SHS || [[../Honda/VIN Codes|Honda]] UK SUV
|-
| SH2 || The Norton Motorcycle Co., Ltd. (TVS Motor Co. subsidiary)
|-
| SH7 || INEOS Automotive truck
|-
| SJA || Bentley SUV
|-
| SJB || Brian James Trailers Ltd
|-
| SJK || Nissan Motor Manufacturing UK - Infiniti
|-
| SJN || Nissan Motor Manufacturing UK - Nissan
|-
| SJ1 || Ree Automotive
|-
| SKA || Vauxhall
|-
| SKB || Kel-Berg Trailers & Trucks
|-
| SKF || Bedford Vehicles
|-
| SKL || Anaig (UK) Technology Ltd
|-
| SKM || King Military Engineering Ltd.
|-
| SLA || Rolls Royce SUV
|-
| SLC || Thwaites Dumpers
|-
| SLG || McMurtry Automotive
|-
| SLN || Niftylift
|-
| SLP || JC Bamford Excavators Ltd.
|-
| SLV || Volvo bus
|-
| SMR || Montracon (truck trailer)
|-
| SMT || Triumph Motorcycles Ltd. (current Triumph Motorcycle company)
|-
| SMW || Cartwright (truck trailer)
|-
| SMX || Gray & Adams (truck trailer)
|-
| SNE || Barkas (East Germany)
|-
| SNE || Wartburg (East Germany)
|-
| SNT || Trabant (East Germany)
|-
| SNZ || MZ (motorcycle) (Germany)
|-
| SPE || B-ON GmbH (Germany)
|-
| ST3 || Calabrese (truck trailer)
|-
| SUA || Autosan (bus)
|-
| SUB || Tramp Trail (trailer)
|-
| SUC || Wiola (trailer)
|-
| SUD || Wielton (truck trailers)
|-
| SUF || FSM/Fiat Auto Poland (Polski Fiat)
|-
| SUG || Mega Trailers (truck trailer) (Poland)
|-
| SUJ || Jelcz (Poland)
|-
| SUL || FSC (Poland)
|-
| SUM || Novatrail (truck trailers)
|-
| SUP || FSO/Daewoo-FSO (Poland)
|-
| SUU || Solaris Bus & Coach (Poland)
|-
| SU9/AR1 || Emtech (truck trailer)
|-
| SU9/BU1 || BODEX (truck trailer)
|-
| SU9/DE2 || Demarco (truck trailer)
|-
| SU9/EB1 || Elbo (truck trailer)
|-
| SU9/EZ1 || Enerco (truck trailer)
|-
| SU9/NC5 || Zasta (truck trailer)
|-
| SU9/NJ1 || Janmil (truck trailer)
|-
| SU9/PL1 || Plandex (truck trailer)
|-
| SU9/PN1 || Solaris Bus & Coach (Poland) - until 2004
|-
| SU9/RE1 || Redos (truck trailer)
|-
| SU9/RE2 || Gromex (trailer)
|-
| SU9/TR1 || Plavec (truck trailer)
|-
| SU9/YV1 || Pilea bus/ARP E-Vehicles (Poland)
|-
| SU9/ZC1 || Wolf (truck trailer)
|-
| SVH || ZASŁAW (truck trailer)
|-
| SVM || Inter Cars (truck trailer)
|-
| SVS || BODEX (truck trailer)
|-
| SV9/BC2 || BC-LDS (truck trailer)
|-
| SV9/DR1 || Dromech (truck trailer)
|-
| SV9/RN1 || Prod-Rent (truck trailer)
|-
| SWH || Temared (trailers)
|-
| SWR || Weekend Trailers (trailers)
|-
| SWV || TA-NO (Poland)
|-
| SWZ || Zremb (trailers)
|-
| SW9/BA1 || Solbus
|-
| SW9/WG3 || Grew / Opalenica (trailer)
|-
| SXE || Neptun Trailers
|-
| SXK || Konar (truck trailer)
|-
| SXM || MELEX Sp. z o.o.
|-
| SXY || Wecon (truck trailer)
|-
| SXX || Martz (trailer)
|-
| SX7 || Arthur Bus
|-
| SX9/GR0 || GRAS (truck trailer)
|-
| SX9/KT1 || AMZ - Kutno (bus)
|-
| SX9/PN1 || Polkon (truck trailer)
|-
| SX9/SP1 || SOMMER Polska (truck trailer)
|-
| SYB || Rydwan (trailer)
|-
| SYG || Gniotpol, GT Trailers Sp. z o. o. (truck trailer)
|-
| SY1 || Neso Bus (PAK-PCE Polski Autobus Wodorowy)
|-
| SY9/FR1 || Feber (truck trailer)
|-
| SY9/PF1 || KEMPF (truck trailer)
|-
| SZA || Scania Poland
|-
| SZC || Vectrix (motorcycle)
|-
| SZL || Boro Trailers
|-
| SZN || Przyczepy Głowacz (trailer)
|-
| SZR || Niewiadów (trailer)
|-
| SZ9/AE6 || Gewe (trailer)
|-
| SZ9/BG1 || GALA Syriusz (trailer)
|-
| SZ9/PW1 || PRO-WAM (truck trailer)
|-
| SZ9/TU1 || Ovibos (truck trailer)
|-
| S19/AM0 || AMO Plant (bus) (Latvia)
|-
| S19/EF1 || Electrify (minibus) (Latvia)
|-
| S19/MT0 || Mono-Transserviss (truck trailer) (Latvia)
|-
| TAW || NAW Nutzfahrzeuggesellschaft Arbon & Wetzikon AG (Switzerland)
|-
| TBS || Boschung AG (Switzerland)
|-
| TCC || Micro Compact Car AG (smart 1998-1999) (Switzerland)
|-
| TDM || QUANTYA Swiss Electric Movement (Switzerland)
|-
| TEB || Bucher Municipal AG (includes Johnston Sweepers) (Switzerland)
|-
| TEM || Twike (SwissLEM AG) (Switzerland)
|-
| TFH || FHS Frech-Hoch AG (truck trailer) (Switzerland)
|-
| TH9/512 || Hess AG (bus, trolleybus) (Switzerland)
|-
| TJ5 || Vezeko (trailer) (Czech Republic)
|-
| TKP || Panav a.s. (truck trailer) (Czech Republic)
|-
| TKX || Agados s.r.o. (trailer) (Czech Republic)
|-
| TKY || Metaco (truck trailer) (Czech Republic)
|-
| TK9/AH3 || Atmos Chrást s.r.o. (Czech Republic)
|-
| TK9/AP3 || Agados, spol. s.r.o. (trailer) (Czech Republic)
|-
| TK9/HP1 || Hipocar (truck trailer) (Czech Republic)
|-
| TK9/PP7 || Paragan Trucks (truck trailer) (Czech Republic)
|-
| TK9/SL5 || SOR Libchavy buses (Czech Republic)
|-
| TK9/SS5 || SVAN Chrudim (truck trailer) (Czech Republic)
|-
| TLJ || Jawa Moto (Czech Republic)
|-
| TMA || [[../Hyundai/VIN Codes|Hyundai]] Motor Manufacturing Czech
|-
| TMB || Škoda Auto|Škoda (Czech Republic)
|-
| TMC || [[../Hyundai/VIN Codes|Hyundai]] Motor Manufacturing Czech (SUV)
|-
| TMK || Karosa (Czech Republic)
|-
| TMP || Škoda trolleybuses (Czech Republic)
|-
| TMT || Tatra passenger car (Czech Republic)
|-
| TM9/CA2 || Oasa bus (Oprava a stavba automobilů) (Czech Republic)
|-
| TM9/SE3 || Škoda Transportation trolleybuses (Czech Republic)
|-
| TM9/SE4 || Škoda Transportation trolleybuses (Czech Republic)
|-
| TM9/TE6 || TEDOM bus (Czech Republic)
|-
| TNA || Avia/Daewoo Avia
|-
| TNE || TAZ
|-
| TNG || LIAZ (Liberecké Automobilové Závody)
|-
| TNT || Tatra trucks
|-
| TNU || Tatra trucks
|-
| TN9/EE7 || Ekova (bus) (Czech Republic)
|-
| TN9/VP5 || VPS (truck trailer)
|-
| TRA || Ikarus Bus
|-
| TRC || Csepel bus
|-
| TRE || Rákos bus
|-
| TRK || Credo bus/Kravtex (Hungary)
|-
| TRR || Rába Bus (Hungary)
|-
| TRU || Audi Hungary (TT/TTS, '12-'13 TT RS)
|-
| TSB || Ikarus Bus
|-
| TSC || VIN assigned by the National Transport Authority of Hungary
|-
| TSE || Ikarus Egyedi Autobuszgyar (EAG) (Hungary)
|-
| TSF || Alfabusz (Hungary)
|-
| TSM || Suzuki Hungary (Magyar Suzuki),<br> Fiat Sedici made by Suzuki, Subaru Justy G3X made by Suzuki, Suzuki Swace made by Toyota UK (TMUK)
|-
| TSY || Keeway Motorcycles (Hungary)
|-
| TS9/111 || NABI Autóbuszipari (bus) (Hungary)
|-
| TS9/130 || Enterprise Bus (Hungary)
|-
| TS9/131 || MJT bus (Hungary)
|-
| TS9/156 || Ikarus / ARC (Auto Rad Controlle Kft.) bus (Hungary)
|-
| TS9/167 || Hungarian Bus Kft. (Hungary)
|-
| TS9/170 || Csaba Metál bus (Hungary)
|-
| TT9/117 || Ikarus Egyedi Autobusz Gyarto Kft. / Magyar Autóbuszgyártó Kft. / MABI (Hungary)
|-
| TT9/123 || Ikarus Global Zrt. (Hungary)
|-
| TWG || CaetanoBus (Portugal)
|-
| TW0 || CaetanoBus (Portugal)
|-
| TW1 || Toyota Caetano Portugal, S.A. (Toyota Coaster, Dyna, Optimo, Land Cruiser 70 Series)
|-
| TW2 || [[../Ford/VIN Codes|Ford]] Lusitana (Portugal)
|-
| TW4 || UMM (Portugal)
|-
| TW6 || Citroën (Portugal)
|-
| TW7 || Mini Moke made by British Leyland & Austin Rover Portugal
|-
| TX5 || Mini Moke made by Cagiva (Moke Automobili)
|-
| TX9/046 || Riotrailer (truck trailer) (Portugal)
|-
| TYA || Mitsubishi Fuso Truck and Bus Corp. Portugal (right-hand drive)
|-
| TYB || Mitsubishi Fuso Truck and Bus Corp. Portugal (left-hand drive)
|-
| T3C || Lohr Backa Topola (truck trailer) (Serbia)
|-
| T49/BG7 || FAP (Serbia)
|-
| T49/BH8 || Megabus (bus) (Serbia)
|-
| T49/BM2 || Feniksbus (minibus) (Serbia)
|-
| T49/V16 || MAZ made by BIK (bus) (Serbia)
|-
| T7A || Ebusco (Netherlands)
|-
| UA1 || AUSA Center (Spain)
|-
| UA2 || Iveco Massif & Campagnola made by Santana Motors in Spain
|-
| UA4 || Irizar e-mobility (Spain)
|-
| UCY || Silence Urban Ecomobility (Spain)
|-
| UD3 || Granalu truck trailers (Belgium)
|-
| UHE || Scanvogn (trailer) (Denmark)
|-
| UHL || Camp-let (recreational vehicle) (Denmark)
|-
| UH2 || Brenderup (trailer) (Denmark)
|-
| UH2 || De Forenede Trailerfabrikke (trailer) (Denmark)
|-
| UH9/DA3 || DAB - Danish Automobile Building (acquired by Scania) (Denmark)
|-
| UH9/EM1 || Egholm (Denmark)
|-
| UH9/FK1 || Dapa Trailer (truck trailer) (Denmark)
|-
| UH9/HF1 || HFR Trailer A/S (truck trailer) (Denmark)
|-
| UH9/HM1 || HMK Bilcon A/S (truck trailer) (Denmark)
|-
| UH9/NS1 || Nopa (truck trailer) (Denmark)
|-
| UH9/NT1 || Nordic Trailer (truck trailer) (Denmark)
|-
| UH9/VM2 || VM Tarm a/s (truck trailer) (Denmark)
|-
| UJG || Garia ApS - Club Car (Denmark)
|-
| UKR || Hero Camper (Denmark)
|-
| UMT || MTDK a/s (truck trailer) (Denmark)
|-
| UN1 || [[../Ford/VIN Codes|Ford]] Ireland
|-
| UN9/012 || Duffy Coachbodies (Ireland)
|-
| UN9/089 || Brian Noone Ltd. bus (Ireland)
|-
| UU1 || Dacia (Romania)
|-
| UU2 || Oltcit
|-
| UU3 || ARO
|-
| UU4 || Roman/Grivbuz
|-
| UU5 || Rocar
|-
| UU6 || Daewoo Romania
|-
| UU7 || Euro Bus Diamond
|-
| UU9 || Astra Bus
|-
| UVW || UMM (truck trailer)
|-
| UV9/AT1 || ATP Trucks, ATP Bus
|-
| UWR || Robus Reșița
|-
| UZT || UTB (Uzina de Tractoare Brașov)
|-
| U1A || Sanos (North Macedonia)
|-
| U1V || VDL Van Hool Macedonia (North Macedonia)
|-
| U5Y || Kia Motors Slovakia
|-
| U59/AS0 || ASKO (truck trailer)
|-
| U6A || Granus (bus) (Slovakia)
|-
| U6Y || Kia Motors Slovakia
|-
| U69/NL1 || Novoplan (bus) (Slovakia)
|-
| U69/SB1 || SlovBus (bus)
|-
| U69/TR8 || Troliga Bus (Slovakia)
|-
| VAG || Steyr-Daimler-Puch Puch G & Steyr-Puch Pinzgauer
|-
| VAH || Hangler (truck trailer)
|-
| VAK || Kässbohrer Transport Technik
|-
| VAN || MAN Austria/Steyr-Daimler-Puch Steyr Trucks
|-
| VAV || Schwarzmüller
|-
| VAX || Schwingenschlogel (truck trailer)
|-
| VA0 || ÖAF, Gräf & Stift
|-
| VA4 || KSR Group (motorcycle)
|-
| VA9/GS0 || Gsodam Fahrzeugbau (truck trailer)
|-
| VA9/RB1 || Rosenbauer International AG (truck)
|-
| VA9/ZT0 || Berger Fahrzeugtechnik (truck trailer)
|-
| VBF || Fit-Zel (trailer)
|-
| VBK || KTM
|-
| VBK || Husqvarna Motorcycles & Gas Gas under KTM ownership
|-
| VCF || Fisker Inc. (Fisker Ocean) made by Magna Steyr
|-
| VFA || Alpine (A310, A610, A110, A390), Renault Alpine GTA
|-
| VFG || Caravelair (caravans)
|-
| VFK || Fruehauf (truck trailers)
|-
| VFN || Trailor, General Trailers (truck trailers)
|-
| VF1 || Renault, Renault GTA '87-'90 (UK market Alpine GTA), Mobilize Duo, Eagle Medallion made by Renault,<br> Opel/Vauxhall Arena made by Renault, Mitsubishi ASX, Colt, Grandis, & Eclipse Cross EV made by Renault
|-
| VF2 || Renault Trucks
|-
| VF3 || Peugeot
|-
| VF4 || Talbot
|-
| VF5 || Iveco Unic
|-
| VF6 || Renault Trucks including vans made by Renault S.A. & Maxity truck made by Nissan Motor Ibérica S.A.
|-
| VF7 || Citroën
|-
| VF8 || Matra Automobiles (Talbot-Matra Murena, Rancho made by Matra, Renault Espace I/II/III, Avantime made by Matra)
|-
| VF9/024 || Legras Industries (truck trailer)
|-
| VF9/045 || Nardeau SAS (truck trailer)
|-
| VF9/049 || G. Magyar (truck trailer)
|-
| VF9/063 || Maisonneuve (truck trailer)
|-
| VF9/132 || Jean CHEREAU S.A.S. (truck trailer)
|-
| VF9/300 || EvoBus France
|-
| VF9/435 || Merceron (truck trailer)
|-
| VF9/519 || Hommell
|-
| VF9/607 || Mathieu (sweeper)
|-
| VF9/673 || Venturi Automobiles
|-
| VF9/795 || [[../Bugatti/VIN Codes|Bugatti Automobiles S.A.S.]]
|-
| VF9/848 || G. Magyar (truck trailer)
|-
| VF9/880 || Bolloré Bluebus
|-
| VF9/938 || SAFRA (bus)
|-
| VGA || Peugeot Motocycles
|-
| VGT || ASCA (truck trailers)
|-
| VGU || Trouillet (truck trailers)
|-
| VGW || BSLT (truck trailers)
|-
| VGX || Coder (truck trailers)
|-
| VGY || Lohr (truck trailers)
|-
| VG5 || MBK (motorcycles) & Yamaha Motor
|-
| VG6 || Renault Trucks & Mack Trucks medium duty trucks made by Renault Trucks
|-
| VG7 || Renault Trucks
|-
| VG8 || Renault Trucks
|-
| VG9/019 || Naya (autonomous vehicle)
|-
| VG9/061 || Alstom-NTL Aptis (bus)
|-
| VHR || Robuste (truck trailer)
|-
| VHX || Manitowoc Cranes - Potain
|-
| VH1 || Benalu SAS (truck trailer)
|-
| VH8 || Microcar
|-
| VJR || Ligier
|-
| VJY || Gruau
|-
| VJ1 || Heuliez Bus
|-
| VJ2 || Mia Electric
|-
| VJ4 || Gruau
|-
| VKD || Cheval Liberté (horse trailer)
|-
| VK1 || SEG (truck trailer)
|-
| VK2 || Grandin Automobiles
|-
| VK8 || Venturi Automobiles
|-
| VLG || Aixam-Mega
|-
| VLU || Scania France
|-
| VL4 || Bluecar, Citroen E-Mehari
|-
| VMK || Renault Sport Spider
|-
| VMS || Automobiles Chatenet
|-
| VMT || SECMA
|-
| VMW || Gépébus Oréos 55
|-
| VM3 || Lamberet (trailer)
|-
| VM3 || Chereau (truck trailer)
|-
| VN1 || Renault SOVAB (France), Opel/Vauxhall Movano A made at SOVAB
|-
| VN4 || Voxan
|-
| VNB || Sherco Motorcycles SARL
|-
| VNE || Iveco Bus/Irisbus (France)
|-
| VNK || [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing France & '11-'13 Daihatsu Charade (XP90) made by TMMF
|-
| VNV || Nissan made in France by Renault
|-
| VPG || MPM Motors
|-
| VPL || Nosmoke S.A.S
|-
| VP3 || G. Magyar (truck trailers)
|-
| VRW || Goupil
|-
| VR1 || DS Automobiles
|-
| VR3 || Peugeot (under Stellantis)
|-
| VR7 || Citroën (under Stellantis)
|-
| VSA || Mercedes-Benz Spain
|-
| VSC || Talbot
|-
| VSE || Santana Motors (Land Rover Series-based models) & Suzuki SJ/Samurai, Jimny, & Vitara made by Santana Motors in Spain
|-
| VSF || Santana Motors (Anibal/PS-10, 300/350)
|-
| VSK || Nissan Motor Iberica SA, Nissan passenger car/MPV/van/SUV/pickup & Ford Maverick 1993–1999
|-
| VSR || Leciñena (truck trailers)
|-
| VSS || SEAT/Cupra
|-
| VSX || Opel Spain
|-
| VSY || Renault V.I. Spain (bus)
|-
| VS1 || Pegaso
|-
| VS5 || Renault Spain
|-
| VS6 || [[../Ford/VIN Codes|Ford]] Spain
|-
| VS7 || Citroën Spain
|-
| VS8 || Peugeot Spain
|-
| VS9/001 || Setra Seida (Spain)
|-
| VS9/011 || Advanced Design Tramontana
|-
| VS9/013 || Mirofret (truck trailer) (Spain)
|-
| VS9/016 || Irizar bus (Spain)
|-
| VS9/019 || Cobos Hermanos (truck trailer) (Spain)
|-
| VS9/031 || Carrocerias Ayats (Spain)
|-
| VS9/032 || Parcisa (truck trailer) (Spain)
|-
| VS9/044 || Beulas bus (Spain) (Spain)
|-
| VS9/047 || Indox (truck trailers) (Spain)
|-
| VS9/052 || Montull (truck trailer) (Spain)
|-
| VS9/057 || SOR Ibérica (truck trailers) (Spain)
|-
| VS9/072 || Mecanicas Silva (truck trailer) (Spain)
|-
| VS9/098 || Sunsundegui bus (Spain)
|-
| VS9/172 || EvoBus Iberica
|-
| VS9/917 || Nogebus (Spain)
|-
| VTD || Montesa Honda (Honda Montesa motorcycle models)
|-
| VTH || Derbi (motorcycles)
|-
| VTL || Yamaha Spain (motorcycles)
|-
| VTM || Montesa Honda (Honda motorcycle models)
|-
| VTP || Rieju S.A. (motorcycles)
|-
| VTR || Gas Gas
|-
| VTT || Suzuki Spain (motorcycles)
|-
| VVC || SOR Ibérica (truck trailers)
|-
| VVG || Tisvol (truck trailers)
|-
| VV1 || Lecitrailer Group (truck trailers)
|-
| VV5 || Prim-Ball (truck trailers)
|-
| VV9/ || [[wikipedia:Tauro Sport Auto|TAURO]] Sport Auto Spain
|-
| VV9/010 || Castrosúa bus (Spain)
|-
| VV9/125 || Indetruck (truck trailers)
|-
| VV9/130 || Vectia Mobility bus (Spain)
|-
| VV9/130 || UNVI bus (Spain)
|-
| VV9/359|| Hispano-Suiza
|-
| VWA || Nissan Vehiculos Industriales SA, Nissan Commercial Vehicles
|-
| VWF || Guillén Group (truck trailers)
|-
| VWL || Indox (truck trailers)
|-
| VWV || Volkswagen Spain
|-
| VXE || Opel Automobile Gmbh/Vauxhall van
|-
| VXF || Fiat van (Fiat Scudo, Ulysse '22-)
|-
| VXK || Opel Automobile Gmbh/Vauxhall car/SUV
|-
| VXY || Neobus a.d. (Serbia)
|-
| VX1 || [[w:Zastava Automobiles|Zastava Automobiles]] / [[w:Yugo|Yugo]] (Yugoslavia/Serbia)
|-
| VYC || Lancia Ypsilon (4th gen.)
|-
| VYE || Jeep Compass (3rd gen. - EU market '26-)
|-
| VYF || Fiat Doblo '23- & Fiat Topolino '23- & Fiat Grande Panda '25-
|-
| VYJ || Ram 1200 '25- (sold in Mexico)
|-
| VYS || Renault & Alpine made by Ampere (Renault 5 E-Tech, Renault 4 E-Tech, Alpine A290)
|-
| VZ2 || Avtomontaža (bus) (Slovenia)
|-
| V1Y || FAS Sanos bus (Yugoslavia/North Macedonia)
|-
| V2X || Ikarbus a.d. (Serbia)
|-
| V31 || Tvornica Autobusa Zagreb (TAZ) (Croatia)
|-
| V34 || Crobus bus (Croatia)
|-
| V39/AB8 || Rimac Automobili (Croatia)
|-
| V39/CB3 || Eurobus (Croatia)
|-
| V39/WB4 || Rasco (machinery) (Croatia)
|-
| V6A || Bestnet AS; Tiki trailers (Estonia)
|-
| V6B || Brentex-Trailer (Estonia)
|-
| V6T || Verge Motorcycles (Estonia)
|-
| V61 || Respo Trailers (Estonia)
|-
| WAC || Arge Audi Porsche (Audi/Porsche RS2 Avant)
|-
| WAF || Ackermann (truck trailer)
|-
| WAG || Neoplan
|-
| WAP || Alpina
|-
| WAU || Audi car
|-
| WA1 || Audi SUV
|-
| WBA || BMW car
|-
| WBC || Boom Trikes
|-
| WBJ || Bitter Cars
|-
| WBK || Böcker Maschinenwerke GmbH
|-
| WBL || Blumhardt (truck trailers)
|-
| WBS || BMW M car
|-
| WBU || Bürstner (caravans)
|-
| WBX || BMW SUV
|-
| WBY || BMW i car
|-
| WB0 || Böckmann Fahrzeugwerke GmbH (trailers)
|-
| WB1 || BMW Motorrad
|-
| WB2 || Blyss (trailer)
|-
| WB3 || BMW Motorrad Motorcycles made in India by TVS
|-
| WB4 || BMW Motorrad Motorscooters made in China by Loncin
|-
| WB5 || BMW i SUV
|-
| WCD || Freightliner Sprinter "bus" (van with more than 3 rows of seats) 2008–2019
|-
| WCM || Wilcox (truck trailer)
|-
| WDA || Mercedes-Benz incomplete vehicle (North America)
|-
| WDB || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] & Maybach
|-
| WDC || Mercedes-Benz SUV
|-
| WDD || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] car
|-
| WDF || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] van/pickup (French & Spanish built models – Citan & Vito & X-Class)
|-
| WDP || Freightliner Sprinter incomplete vehicle 2005–2019
|-
| WDR || Freightliner Sprinter MPV (van with 2 or 3 rows of seats) 2005–2019
|-
| WDT || Dethleffs (caravans)
|-
| WDW || Dodge Sprinter "bus" (van with more than 3 rows of seats) 2008–2009
|-
| WDX || Dodge Sprinter incomplete vehicle 2005–2009
|-
| WDY || Freightliner Sprinter truck (cargo van with 1 row of seats) 2005–2019
|-
| WDZ || Mercedes-Benz "bus" (van with more than 3 rows of seats) (North America)
|-
| WD0 || Dodge Sprinter truck (cargo van with 1 row of seats) 2005–2009
|-
| WD1 || Freightliner Sprinter 2002 & Sprinter (Dodge or Freightliner) 2003–2005 incomplete vehicle
|-
| WD2 || Freightliner Sprinter 2002 & Sprinter (Dodge or Freightliner) 2003–2005 truck (cargo van with 1 row of seats)
|-
| WD3 || Mercedes-Benz truck (cargo van with 1 row of seats) (North America)
|-
| WD4 || Mercedes-Benz MPV (van with 2 or 3 rows of seats) (North America)
|-
| WD5 || Freightliner Sprinter 2002 & Sprinter (Dodge or Freightliner) 2003–2005 MPV (van with 2 or 3 rows of seats)
|-
| WD6 || Freightliner Unimog truck
|-
| WD7 || Freightliner Unimog incomplete vehicle
|-
| WD8 || Dodge Sprinter MPV (van with 2 or 3 rows of seats) 2005–2009
|-
| WEB || Evobus GmbH (Mercedes-Benz buses)
|-
| WEG || Ablinger (trailer)
|-
| WEL || e.GO Mobile AG
|-
| WFB || Feldbinder Spezialfahrzeugwerke GmbH
|-
| WFC || Fendt (caravans)
|-
| WFD || Fliegl Trailer
|-
| WFN || Tadano Faun GmbH
|-
| WF0 || [[../Ford/VIN Codes|Ford]] Germany
|-
| WF1 || Merkur
|-
| WGB || Göppel Bus GmbH
|-
| WG0 || Goldhofer AG (truck trailer)
|-
| WHB || Hobby - Wohnwagenwerk, Ing. H. Striewski GmbH (recreational vehicles)
|-
| WHD || Humbaur GmbH (truck trailer)
|-
| WHL || Hulco (trailer)
|-
| WHW || Hako GmbH
|-
| WHY || Hymer GmbH & Co. KG (recreational vehicles)
|-
| WH7 || Hüfferman (truck trailer)
|-
| WJM || Iveco/Iveco Magirus
|-
| WJR || Irmscher
|-
| WKE || Krone (truck trailers)
|-
| WKK || Setra (Evobus GmbH; formerly Kässbohrer)
|-
| WKN || Knaus, Weinsberg (caravans)
|-
| WKV || Kässbohrer Fahrzeugwerke Gmbh (truck trailers)
|-
| WK0 || Kögel (truck trailers)
|-
| WLA || Langendorf semi-trailers
|-
| WLF || Liebherr (mobile crane)
|-
| WMA || MAN Truck & Bus
|-
| WME || smart (from 5/99)
|-
| WMG || Demag Cranes
|-
| WMM || Karl Müller GmbH & Co. KG (truck trailers)
|-
| WMP || M & V GmbH (truck trailers)
|-
| WMU || Hako GmbH (Multicar)
|-
| WMW || MINI car
|-
| WMX || Mercedes-AMG used for Mercedes-Benz SLS AMG & Mercedes-AMG GT & Mercedes-AMG One (not used in North America)
|-
| WMZ || MINI SUV
|-
| WNA || Next.e.GO Mobile SE
|-
| WP0 || Porsche car
|-
| WP1 || Porsche SUV
|-
| WRA || Renders (truck trailers)
|-
| WRJ || Riese & Müller (bicycle)
|-
| WSE || STEMA Metalleichtbau GmbH (trailers)
|-
| WSJ || STERK Trailers (truck trailers)
|-
| WSK || Schmitz-Cargobull Gotha (truck trailers)
|-
| WSM || Schmitz-Cargobull (truck trailers)
|-
| WSP || Spitzer (truck trailers)
|-
| WSV || Aebi Schmidt Group
|-
| WS5 || StreetScooter
|-
| WS7 || Sono Motors
|-
| WTA || Tabbert (caravans)
|-
| WUA || Audi Sport GmbH (formerly quattro GmbH) car <br> (includes '04-'09 S4 Cabriolet & '06 S4 25quattro Special Edition sedan & '16-'18 S8 Plus & non-North American mkt. Q7 V12 TDI)
|-
| WU1 || Audi Sport GmbH (formerly quattro GmbH) SUV
|-
| WVG || Volkswagen SUV & Touran & N. American mkt. ID Buzz '25
|-
| WVM || Arbeitsgemeinschaft VW-MAN
|-
| WVP || Viseon Bus
|-
| WVW || Volkswagen passenger car, Sharan, Golf Plus, Golf Sportsvan
|-
| WV1 || Volkswagen Commercial Vehicles (cargo van or 1st gen. Amarok)
|-
| WV2 || Volkswagen Commercial Vehicles (passenger van or minibus)
|-
| WV3 || Volkswagen Commercial Vehicles (incomplete vehicle: chassis cab/cutaway)<br> [includes Winnebago Rialta ('97-'04), Winnebago Vista ('02-'04), Itasca Sunstar ('02-'04)]
|-
| WV4 || Volkswagen Commercial Vehicles (2nd gen. Amarok & T7 Transporter made by Ford)
|-
| WV5 || Volkswagen Commercial Vehicles (T7 Caravelle made by Ford)
|-
| WWA || Wachenhut (truck trailer)
|-
| WWC || WM Meyer (truck trailer)
|-
| WZ1 || Toyota Supra (Fifth generation for North America)
|-
| W0D || Obermaier (truck trailer)
|-
| W0L || Adam Opel AG/Vauxhall & Holden
|-
| W0L || Holden Zafira & Subaru Traviq made by GM Thailand
|-
| W0V || Opel Automobile Gmbh/Vauxhall & Holden (since 2017)
|-
| W04 || Buick Regal & Buick Cascada
|-
| W06 || Cadillac Catera
|-
| W08 || Saturn Astra
|-
| W09/A55 || Artega Automobile
|-
| W09/A71 || Apollo
|-
| W09/B09 || Bitter Cars
|-
| W09/B16 || Brabus
|-
| W09/B48 || Bultmann (trailer)
|-
| W09/B91 || Boerner (truck trailer)
|-
| W09/C09 || Carnehl Fahrzeugbau (truck trailer)
|-
| W09/D04 || DOLL (truck trailer)
|-
| W09/D05 || Drögmöller (bus)
|-
| W09/D17 || Dinkel (truck trailer)
|-
| W09/E04 || Eder (trailer)
|-
| W09/E27 || Esterer (truck trailer)
|-
| W09/E32 || ES-GE (truck trailer)
|-
| W09/E45 || Eurotank (truck trailer)
|-
| W09/F46 || FSN Fahrzeugbau (truck trailer)
|-
| W09/F57 || Twike
|-
| W09/G10 || GOFA (truck trailer)
|-
| W09/G64 || Gumpert
|-
| W09/H10 || Heitling Fahrzeugbau
|-
| W09/H21|| Dietrich Hisle GmbH (truck trailer)
|-
| W09/H46 || Hendricks (truck trailer)
|-
| W09/H49 || H&W Nutzfahrzeugtechnik GmbH (truck trailer)
|-
| W09/J02 || Isdera
|-
| W09/K27 || Krupp
|-
| W09/K27 || Kotschenreuther (truck trailer)
|-
| W09/L05 || Liebherr
|-
| W09/L06 || LMC Caravan (recreational vehicles)
|-
| W09/M08 || MEILLER Kipper (truck trailer)
|-
| W09/M09 || Meierling (truck trailer)
|-
| W09/M29 || MAFA (truck trailer)
|-
| W09/M40 || Franz Mersch (trailer)
|-
| W09/M79 || MKF Matallbau (truck trailer)
|-
| W09/N22 || NFP-Eurotrailer (truck trailer)
|-
| W09/P13 || Pagenkopf (truck trailer)
|-
| W09/P72 || De Tomaso Automobili (Capricorn)
|-
| W09/R06 || RUF
|-
| W09/R14 || Rancke (truck trailer)
|-
| W09/R27 || Gebr. Recker Fahrzeugbau (truck trailer)
|-
| W09/R30 || Reisch (truck trailer)
|-
| W09/R38 || Rewaco
|-
| W09/SG0 || Sileo (bus)
|-
| W09/SG1 || SEKA (truck trailer)
|-
| W09/S24 || Sommer (truck trailer)
|-
| W09/S25 || Spermann (truck trailer)
|-
| W09/S27 || Schröder (truck trailer)
|-
| W09/W11 || Wilken (truck trailer)
|-
| W09/W14 || Weka (truck trailer)
|-
| W09/W16 || Wellmeyer (truck trailer)
|-
| W09/W20 || Kurt Willig GmbH & Co. KG (truck trailer)
|-
| W09/W29 || Wiese (truck trailer)
|-
| W09/W35 || Wecon GmbH (truck trailer)
|-
| W09/W46 || WT-Metall (trailer)
|-
| W09/W59 || Wiesmann
|-
| W09/W70 || Wüllhorst (truck trailer)
|-
| W09/W86 || Web Trailer GmbH (truck trailer)
|-
| W09/004 || ORTEN Fahrzeugbau (truck trailer)
|-
| W1A || smart
|-
| W1H || Freightliner Econic
|-
| W1K || Mercedes-Benz car
|-
| W1N || Mercedes-Benz SUV
|-
| W1T || Mercedes-Benz truck
|-
| W1V || Mercedes-Benz van
|-
| W1W || Mercedes-Benz MPV (van with 2 or 3 rows of seats) (North America)
|-
| W1X || Mercedes-Benz incomplete vehicle (North America)
|-
| W1Y || Mercedes-Benz truck (cargo van with 1 row of seats) (North America)
|-
| W1Z || Mercedes-Benz "bus" (van with more than 3 rows of seats) (North America)
|-
| W2W || Freightliner Sprinter MPV (van with 2 or 3 rows of seats)
|-
| W2X || Freightliner Sprinter incomplete vehicle
|-
| W2Y || Freightliner Sprinter truck (cargo van with 1 row of seats)
|-
| W2Z || Freightliner Sprinter "bus" (van with more than 3 rows of seats)
|-
| XDN || Mercedes Sprinter Classic made by GAZ (Russia)
|-
| XD2 || CTTM Cargoline (truck trailer) (Russia)
|-
| XEA || AmberAvto (Avtotor) (Russia)
|-
| XE2 || AMKAR Automaster (truck trailer) (Russia)
|-
| XF9/B24 || NK Trailers (truck trailer) (Greece)
|-
| XF9/D44 || Militsis (trailer) (Greece)
|-
| XF9/J03 || Christos Nezis (truck trailer) (Greece)
|-
| XF9/J63 || Kaoussis (truck trailer) (Greece)
|-
| XG3 || Petros Petropoulos Group - Ecoshift NOOS electric motorscooters (Greece)
|-
| XG4|| Mpitis (trailer) (Greece)
|-
| XG5 || Stavropoulos trailers (Greece)
|-
| XG6 || MGK Hellenic Motor motorcycles (Greece)
|-
| XG8 || Gorgolis SA motorcycles (Greece)
|-
| XG9/B01 || Sfakianakis bus Greece
|-
| XG9/H33 || Rappas Trailer (Greece)
|-
| XG9/H51 || Eurotrailer Tourlakopoulos (trailer) (Greece)
|-
| XG9/H92 || Diamantis N. & Co. (trailer) (Greece)
|-
| XΗ9/B21 || Hellenic Vehicle Industry - ELVO bus Greece
|-
| XH9/H08 || Poseidonas Litsakis (trailer) (Greece)
|-
| XH9/H34 || Flexi-Wheels (trailer) (Greece)
|-
| XJY || Bonum (truck trailer) (Russia)
|-
| XJ4 || PKTS (PK Transportnye Sistemy) bus (Russia)
|-
| XKM || Volgabus (Russia)
|-
| XLA || DAF Bus International
|-
| XLB || Volvo Car B.V./NedCar B.V. (Volvo Cars)
|-
| XLC || [[../Ford/VIN Codes|Ford]] Netherlands
|-
| XLD || Pacton Trailers B.V.
|-
| XLE || Scania Netherlands
|-
| XLH || Hapert (trailer)
|-
| XLJ || Anssems (trailer)
|-
| XLK || Burg Trailer Service BV (truck trailer)
|-
| XLR || DAF Trucks & Leyland DAF
|-
| XLU || Henra (trailer)
|-
| XLV || DAF Bus
|-
| XLW || Terberg Benschop BV
|-
| XL3 || Ebusco
|-
| XL4 ||Lightyear
|-
| XL9/001 || ESVE BV (truck trailers)
|-
| XL9/002 || Jumbo Groenewegen (truck trailers)
|-
| XL9/003 || Autobusfabriek Bova BV
|-
| XL9/004 || G.S. Meppel (truck trailers)
|-
| XL9/007|| Broshuis BV (truck trailer)
|-
| XL9/010|| Ginaf Trucks
|-
| XL9/014 || Contar (truck trailer)
|-
| XL9/017 || Van Eck (truck trailer)
|-
| XL9/021 || Donkervoort Cars
|-
| XL9/033 || Wijer (trailer)
|-
| XL9/039 || Talson (truck trailer)
|-
| XL9/042 || Den Oudsten Bussen
|-
| XL9/052 || Witteveen (trailer)
|-
| XL9/055 || Fripaan (truck trailer)
|-
| XL9/067 || HTF (truck trailer)
|-
| XL9/068 || Vogelzang (truck trailer)
|-
| XL9/069 || Kraker (truck trailer)
|-
| XL9/070 || Veldhuizen (truck trailers)
|-
| XL9/073 || Zwalve (truck trailers)
|-
| XL9/074 || Draco (truck trailers)
|-
| XL9/081 || EBO van Weel (truck trailers)
|-
| XL9/084 || Vocol (truck trailers)
|-
| XL9/089 || Meijvo (trailers)
|-
| XL9/092 || Bulthuis (truck trailers)
|-
| XL9/103 || D-TEC (truck trailers)
|-
| XL9/109|| Groenewold Carrosseriefabriek B.V. (car transporter)
|-
| XL9/150 || Univan (truck trailer)
|-
| XL9/251 || Spierings Mobile Cranes
|-
| XL9/320 || VDL Bova bus
|-
| XL9/348 || HOKA (trailer)
|-
| XL9/355 || Berdex (truck trailer)
|-
| XL9/363 || Spyker
|-
| XL9/423 || Tijhof (trailer)
|-
| XL9/461 || BK Market Trailers (trailer)
|-
| XL9/495 || BE-Combi (truck trailer)
|-
| XL9/508 || Talson (truck trailer)
|-
| XL9/527 || GINAF
|-
| XL9/530 || Ebusco
|-
| XL9/611 || Zocon (trailer)
|-
| XMC || NedCar B.V. Mitsubishi Motors (LHD)
|-
| XMD || NedCar B.V. Mitsubishi Motors (RHD)
|-
| XMG || VDL Bus International
|-
| XMR || Nooteboom Trailers
|-
| XM4 || RAVO Holding B.V. (sweeper)
|-
| XNB || NedCar B.V. Mitsubishi Motors made by Pininfarina (Colt CZC convertible - RHD)
|-
| XNC || NedCar B.V. Mitsubishi Motors made by Pininfarina (Colt CZC convertible - LHD)
|-
| XNJ || Broshuis (truck trailer)
|-
| XNL || VDL Bus & Coach
|-
| XNT || Pacton Trailers B.V. (truck trailer)
|-
| XN1 || Kraker Trailers Axel B.V. (truck trailer)
|-
| XPN || Knapen Trailers
|-
| XPP || Atec Trailers
|-
| XP7 || Tesla Europe (based in the Netherlands) (Gigafactory Berlin-Brandenburg)
|-
| XRP || Proline (trailer)
|-
| XRY || D-TEC (truck trailer)
|-
| XR7 || Qarry
|-
| XTA || Lada / AvtoVAZ (Russia)
|-
| XTB || Moskvitch / AZLK (Russia)
|-
| XTC || KAMAZ (Russia)
|-
| XTD || LuAZ (Ukraine)
|-
| XTE || ZAZ (Ukraine)
|-
| XTF || GolAZ (Russia)
|-
| XTH || GAZ (Russia)
|-
| XTJ || Lada Oka made by SeAZ (Russia)
|-
| XTK || IzhAvto (Russia)
|-
| XTM || MAZ (Belarus); used until 1997
|-
| XTP || Ural (Russia)
|-
| XTS || ChMZAP (truck trailer)
|-
| XTT || UAZ / Sollers (Russia)
|-
| XTU || Trolza, previously ZiU (Russia)
|-
| XTW || LAZ (Ukraine)
|-
| XTY || LiAZ (Russia)
|-
| XTZ || ZiL (Russia)
|-
| XUF || General Motors Russia
|-
| XUS || Nizhegorodets (minibus) (Russia)
|-
| XUU || Avtotor (Russia, Chevrolet Korea SKD, Kaiyi Auto)
|-
| XUV || Avtotor (DFSK, SWM)
|-
| XUZ || InterPipeVAN (truck trailer)
|-
| XU6 || Avtodom (minibus) (Russia)
|-
| XVG || MARZ (bus) (Russia)
|-
| XVU || Start (truck trailer)
|-
| XWB || UZ-Daewoo/GM Uzbekistan/Ravon/UzAuto Motors (Uzbekistan)
|-
| XWD || Avtotor (Russia, BAIC SKD)
|-
| XWE || Avtotor (Russia, Hyundai-Kia SKD)
|-
| XWF || Avtotor (Russia, Chevrolet Tahoe/Opel/Cadillac/Hummer SKD)
|-
| XWK || Kia assembled in Russia by IzhAvto
|-
| XW7 || Toyota Motor Manufacturing Russia
|-
| XW8 || Volkswagen Group Russia (VW, Skoda)
|-
| XX3 || Ujet Manufacturing (Luxembourg)
|-
| XZB || SIMAZ (bus) (Russia)
|-
| XZE || Specpricep (truck trailer)
|-
| XZG || Great Wall Motor (Haval Motor Rus)
|-
| XZP || Gut Trailer (truck trailer)
|-
| XZT || FoxBus (minibus) (Russia)
|-
| X1D || RAF (Rīgas Autobusu Fabrika) (Latvia)
|-
| X1E || KAvZ (Russia)
|-
| X1F || NefAZ (Russia)
|-
| X1M || PAZ (Russia)
|-
| X1P || Ural (Russia)
|-
| X2L || Fox Trailer (truck trailer) (Russia)
|-
| X21 || Diesel-S (truck trailer) (Russia)
|-
| X4K || Volgabus (Volzhanin) (Russia)
|-
| X4T || Sommer (truck trailer) (Russia)
|-
| X4X || Avtotor (Russia, BMW SKD)
|-
| X5A || UralSpetzTrans (trailer) (Russia)
|-
| X6D || VIS-AVTO (Russia)
|-
| X6S || TZA (truck trailer) (Russia)
|-
| X7L || Renault AvtoFramos (1998-2014), Renault Russia (2014-2022), Moskvitch (2022-) (Russia)
|-
| X7M || [[../Hyundai/VIN Codes|Hyundai]] & Vortex (rebadged Chery) made by TagAZ (Russia)
|-
| X89/AD4 || ВМЗ (VMZ) bus
|-
| X89/BF8 || Rosvan bus
|-
| X89/CU2 || EvoBus Russland (bus)
|-
| X89/DJ2 || VMK (bus)
|-
| X89/EY4 || Brabill (minibus)
|-
| X89/FF6 || Lotos (bus)
|-
| X89/FY1 || Sherp
|-
| X8J || IMZ-Ural Ural Motorcycles
|-
| X8U || Scania Russia
|-
| X9F || Ford Motor Company ZAO
|-
| X9L || GM-AvtoVAZ (Chevrolet Niva & Viva)
|-
| X9N || Samoltor (minibus)
|-
| X9P || Volvo Vostok ZAO (Volvo Trucks)
|-
| X9W || Brilliance, Lifan made by Derways
|-
| X9X || Great Wall Motors
|-
| X96 || GAZ
|-
| X99/000 || Marussia
|-
| X90 || GRAZ (truck trailer)
|-
| X0T || Tonar (truck trailer)
|-
| YAF || Faymonville (special transport trailers)
|-
| YAG || Syma aanhangwagenbouw BV (trailers)
|-
| YAM || MAX Trailer (truck trailers)
|-
| YAR || Toyota Motor Europe (based in Belgium) used for Toyota ProAce, Toyota ProAce City and Toyota ProAce Max made by PSA/Stellantis
|-
| YA2 || Atlas Copco Group
|-
| YA5 || Renders (truck trailers)
|-
| YA9/ || Lambrecht Constructie NV (truck trailers)
|-
| YA9/111 || OVA (truck trailer)
|-
| YA9/121 || Atcomex (truck trailer)
|-
| YA9/128 || EOS (bus)
|-
| YA9/139 || ATM Maaseik (truck trailer)
|-
| YA9/168 || Forthomme s.a. (truck trailer)
|-
| YA9/169 || Automobiles Gillet
|-
| YA9/180 || EOS (bus)
|-
| YA9/191 || Stokota (truck trailers)
|-
| YA9/195 || Denolf & Depla (minibus)
|-
| YBC || Toyota Supra (Fifth generation for Europe)
|-
| YBD || Addax Motors
|-
| YBW || Volkswagen Belgium
|-
| YB1 || Volvo Trucks Belgium (truck)
|-
| YB2 || Volvo Trucks Belgium (bus chassis)
|-
| YB3 || Volvo Trucks Belgium (incomplete vehicle)
|-
| YB4 || LAG Trailers N.V. (truck trailer)
|-
| YB6 || Jonckheere (VDL Belgium)
|-
| YCM || Mazda Motor Logistics Europe (based in Belgium) used for European-market Mazda 121 made by Ford in UK
|-
| YC1 || Honda Belgium NV (motorcycle)
|-
| YC3 || Eduard Trailers
|-
| YD3 || Chateau Caravans (Belgium)
|-
| YE1 || Van Hool (trailers) (Belgium)
|-
| YE2 || Van Hool (buses) (Belgium)
|-
| YE6 || STAS (truck trailer)
|-
| YE7 || Turbo's Hoet (truck trailer)
|-
| YF1 || Närko (truck trailer) (Finland)
|-
| YF3 || NTM (truck trailer) (Finland)
|-
| YF9/050 || JYKI (truck trailer) (Finland)
|-
| YGU || JJ-Trailer (trailer) (Finland)
|-
|YG6
|Majava Group Oy; Majava trailers (Finland)
|-
| YH1 || Solifer (caravans)
|-
| YH2 || BRP Finland (Lynx snowmobiles)
|-
| YH4 || Fisker Automotive (Fisker Karma) built by Valmet Automotive
|-
| YK1 || Saab-Valmet Finland
|-
| YK2, YK7 || Sisu Auto
|-
| YK9/003 || Kabus (bus)
|-
| YK9/008 || Lahden Autokori (-2013), SOE Busproduction Finland (2014-2024) (bus)
|-
| YK9/016 || Linkker (bus)
|-
| YSC || Cadillac BLS (made by Saab)
|-
| YSM || Polestar cars
|-
| YSP || Volta Trucks AB
|-
| YSR || Polestar SUV
|-
| YS2 || Scania commercial vehicles (Södertälje factory)
|-
| YS3 || Saab cars
|-
| YS4 || Scania buses and bus chassis until 2002 (Katrineholm factory)
|-
| YS5 || OmniNova (minibus)
|-
| YS7 || Solifer (recreational vehicles)
|-
| YS9/KV1 || Backaryd (minibus)
|-
| YTN || Saab made by NEVS
|-
| YT7 || Kabe (recreational vehicles)
|-
| YT9/007 || Koenigsegg
|-
| YT9/034 || Carvia
|-
| YU1 || Fogelsta, Brenderup Group (trailer)
|-
| YU7 || Husaberg (motorcycles)
|-
| YVV || WiMa 442 EV
|-
| YV1 || [[../Volvo/VIN Codes|Volvo]] cars
|-
| YV2 || [[../Volvo/VIN Codes|Volvo]] trucks
|-
| YV3 || [[../Volvo/VIN Codes|Volvo]] buses and bus chassis
|-
| YV4 || [[../Volvo/VIN Codes|Volvo]] SUV
|-
| YV5 || [[../Volvo/VIN Codes|Volvo Trucks]] incomplete vehicle
|-
| YYB || Tysse (trailer) (Norway)
|-
| YYC || Think Nordic (Norway)
|-
| YY9/017 || Skala Fabrikk (truck trailer) (Norway)
|-
| Y29/005 || Buddy Electric (Norway)
|-
| Y3D || MTM (truck trailer) (Belarus)
|-
| Y3F || Lida Buses Neman (Belarus)
|-
| Y3J || Belkommunmash (Belarus)
|-
| Y3K || Neman Bus (Belarus)
|-
| Y3M || MAZ (Belarus)
|-
| Y3W || VFV built by Unison (Belarus)
|-
| Y39/047 || Altant-M (minibus) (Belarus)
|-
| Y39/051 || Bus-Master (minibus) (Belarus)
|-
| Y39/052 || Aktriya (minibus) (Belarus)
|-
| Y39/072 || Klassikbus (minibus) (Belarus)
|-
| Y39/074 || Alterra (minibus) (Belarus)
|-
| Y39/135 || EuroDjet (minibus) (Belarus)
|-
| Y39/240 || Alizana (minibus) (Belarus)
|-
| Y39/241 || RSBUS (minibus) (Belarus)
|-
| Y39/323 || KF-AVTO (minibus) (Belarus)
|-
| Y4F || [[../Ford/VIN Codes|Ford]] Belarus
|-
| Y4K || Geely / BelGee (Belarus)
|-
| Y6B || Iveco (Ukraine)
|-
| Y6D || ZAZ / AvtoZAZ, Chevrolet Lanos made by ZAZ (Ukraine)
|-
| Y6E || LAZ (Ukraine)
|-
| Y6J || Bogdan group (Ukraine)
|-
| Y6L || Bogdan group including buses, Lada, & Hyundai made by Bogdan (Ukraine)
|-
| Y6U || Škoda Auto made by Eurocar (Ukraine)
|-
| Y6W || PGFM (trailer) (Ukraine)
|-
| Y6Y || LEV (trailer) (Ukraine)
|-
| Y69/B19 || Stryi Avto (bus) (Ukraine)
|-
| Y69/B98 || VESTT (truck trailer) (Ukraine)
|-
| Y69/C49 || TAD (truck trailer) (Ukraine)
|-
| Y69/D75 || Barrel Dash (truck trailer) (Ukraine)
|-
| Y7A || KrAZ trucks (Ukraine)
|-
| Y7B || Bogdan group (Ukraine)
|-
| Y7C || Great Wall Motors, Geely made by KrASZ (Ukraine)
|-
| Y7D || GAZ made by KrymAvtoGAZ (Ukraine)
|-
| Y7F || Boryspil Bus Factory (BAZ) (Ukraine)
|-
| Y7S || Korida-Tech (trailer) (Ukraine)
|-
| Y7W || Geely made by KrASZ (Ukraine)
|-
| Y7X || ChRZ - Ruta (minibus) (Ukraine)
|-
| Y79/A23 || OdAZ (truck trailer) (Ukraine)
|-
| Y79/B21 || Everlast (truck trailer) (Ukraine)
|-
| Y79/B65 || Avtoban (trailer) (Ukraine)
|-
| Y8A || LAZ (Ukraine)
|-
| Y8H || UNV Leader (trailer) (Ukraine)
|-
| Y8S || Alekseevka Ximmash (truck trailer)
|-
| Y8X || GAZ Gazelle made by KrASZ (Ukraine)
|-
| Y89/A98 || VARZ (trailer) (Ukraine)
|-
| Y89/B75 || Knott (trailer) (Ukraine)
|-
| Y89/C65 || Electron (Ukraine)
|-
| Y9A || PAVAM (trailer) (Ukraine)
|-
| Y9H || LAZ (Ukraine)
|-
| Y9M || AMS (trailer) (Ukraine)
|-
| Y9T || Dnipro (trailer) (Ukraine)
|-
| Y9W || Pragmatec (trailer) (Ukraine)
|-
| Y9Z || Lada, Renault made in Ukraine
|-
| Y99/B32 || Santey (trailer) (Ukraine)
|-
| Y99/E21 || Zmiev-Trans (truck trailer) (Ukraine)
|-
| Y99/C79 || Electron (bus) (Ukraine)
|-
| ZAA || Autobianchi
|-
| ZAA || Alfa Romeo Junior 2024-
|-
| ZAC || Jeep, Dodge Hornet
|-
| ZAH || Rolfo SpA (car transporter)
|-
| ZAJ || Trigano SpA; Roller Team recreational vehicles
|-
| ZAM || [[../Maserati/VIN Codes|Maserati]]
|-
| ZAP || Piaggio/Vespa/Gilera
|-
| ZAR || Alfa Romeo car
|-
| ZAS || Alfa Romeo Alfasud & Sprint through 1989
|-
| ZAS || Alfa Romeo SUV 2018-
|-
| ZAX || Zorzi (truck trailer)
|-
| ZA4 || Omar (truck trailer)
|-
| ZA9/A12 || [[../Lamborghini/VIN Codes|Lamborghini]] through mid-2003 (including LM002)
|-
| ZA9/A17 || Carrozzeria Luigi Dalla Via (bus)
|-
| ZA9/A18 || De Simon (bus)
|-
| ZA9/A33 || Bucher Schörling Italia (sweeper)
|-
| ZA9/A47 || Silver Car (truck trailer)
|-
| ZA9/B09 || Mauri Bus System
|-
| ZA9/B34 || Mistrall Siloveicoli (truck trailer)
|-
| ZA9/B45 || Bolgan (truck trailer)
|-
| ZA9/B49 || OMSP Macola (truck trailer)
|-
| ZA9/B95 || Carrozzeria Autodromo Modena (bus)
|-
| ZA9/C38 || Dulevo (sweeper)
|-
| ZA9/D38 || Cizeta Automobili SRL
|-
| ZA9/D39 || [[../Bugatti/VIN Codes|Bugatti Automobili S.p.A]]
|-
| ZA9/D50 || Italdesign Giugiaro
|-
| ZA9/E15 || Tecnobus Industries S.r.l.
|-
| ZA9/E73 || Sitcar (bus)
|-
| ZA9/E88 || Cacciamali (bus)
|-
| ZA9/F16 || OMT (truck trailer)
|-
| ZA9/F21 || FGM (truck trailer)
|-
| ZA9/F48 || Rampini Carlo S.p.A. (bus)
|-
| ZA9/F76 || Pagani Automobili S.p.A.
|-
| ZA9/G97 || EPT Horus (bus)
|-
| ZA9/H02 || O.ME.P.S. (truck trailer)
|-
| ZA9/H44|| Green-technik by Green Produzione s.r.l. (machine trailer)
|-
| ZA9/J21 || VRV (truck trailer)
|-
| ZA9/J93 || Barbi (bus)
|-
| ZA9/K98 || Esagono Energia S.r.l.
|-
| ZA9/M09 || Italdesign Automobili Speciali
|-
| ZA9/M27 || Dallara Stradale
|-
| ZA9/M91 || Automobili Pininfarina
|-
| ZA9/180 || De Simon (bus)
|-
| ZA0 || Acerbi (truck trailer)
|-
| ZBA || Piacenza (truck trailer)
|-
| ZBB || Bertone
|-
| ZBD || InBus
|-
| ZBN || Benelli
|-
| ZBW || Rayton-Fissore Magnum
|-
| ZB3 || Cardi (truck trailer)
|-
| ZCB || E. Bartoletti SpA (truck trailer)
|-
| ZCF || Iveco / Irisbus (Italy)
|-
| ZCG || Cagiva SpA / MV Agusta
|-
| ZCG || Husqvarna Motorcycles Under MV Agusta ownership
|-
| ZCM || BredaMenarinibus / Menarinibus / IIA (Industria Italiana Autobus)
|-
| ZCN || Astra Veicoli Industriali S.p.A.
|-
| ZCV || Vibreti (truck trailer)
|-
| ZCZ || BredaBus
|-
| ZC1 || AnsaldoBreda S.p.A.
|-
| ZC2 || Chrysler TC by Maserati
|-
| ZDC || Honda Italia Industriale SpA
|-
| ZDF || [[../Ferrari/VIN Codes|Ferrari]] Dino
|-
| ZDJ || ACM Biagini
|-
| ZDM || Ducati Motor Holdings SpA
|-
| ZDT || De Tomaso Modena SpA
|-
| ZDY || Cacciamali
|-
| ZD0 || Yamaha Motor Italia SpA & Belgarda SpA
|-
| ZD3 || Beta Motor
|-
| ZD4 || Aprilia
|-
| ZD5 || Casalini
|-
| ZEB || Ellebi (trailer)
|-
| ZEH || Trigano SpA (former SEA Group); McLouis & Mobilvetta recreational vehicles
|-
| ZES || Bimota
|-
| ZEX || TM Racing (motorcycle)
|-
| ZE5 || Carmosino (truck trailer)
|-
| ZFA || Fiat
|-
| ZFB || Fiat MPV/SUV & Ram Promaster City
|-
| ZFC || Fiat truck (Fiat Ducato for Mexico, Ram 1200)
|-
| ZFE || KL Motorcycle
|-
| ZFF || [[../Ferrari/VIN Codes|Ferrari]]
|-
| ZFJ || Carrozzeria Pezzaioli (truck trailer)
|-
| ZFM || Fantic Motor
|-
| ZFR || Pininfarina
|-
| ZF4 || Qvale
|-
| ZGA || Iveco Bus
|-
| ZGP || Merker (truck trailer)
|-
| ZGU || Moto Guzzi
|-
| ZG2 || FAAM (commercial vehicle)
|-
| ZHU || Husqvarna Motorcycles Under Cagiva ownership
|-
| ZHW || [[../Lamborghini/VIN Codes|Lamborghini]] (Mid-2003 – )
|-
| ZHZ || Menci SpA (truck trailer)
|-
| ZH5 || FB Mondial (motorcycle)
|-
| ZJM || Malaguti
|-
| ZJN || Innocenti
|-
| ZJT || Italjet
|-
| ZKC || Ducati Energia Free Duck (electric quadricycle)
|-
| ZKH || Husqvarna Motorcycles Srl Under BMW ownership
|-
| ZLA || Lancia
|-
| ZLF || Tazzari GL SpA
|-
| ZLM || Moto Morini srl
|-
| ZLV || Laverda
|-
| ZNN || Energica
|-
| ZN0 || SWM Motorcycles S.r.l.
|-
| ZN3 || Iveco Defence
|-
| ZN6 || Maserati SUV
|-
| ZPB || [[../Lamborghini/VIN Codes|Lamborghini]] SUV
|-
| ZPY || DR Automobiles
|-
| ZP6 || XEV
|-
| ZP8 || Regis Motors
|-
| ZRG || Tazzari GL Imola SpA
|-
| ZR1 || Microlino
|-
| ZSG || [[../Ferrari/VIN Codes|Ferrari]] SUV
|-
| ZX1 || TAM (Tovarna Avtomobilov Maribor) bus (Slovenia)
|-
| ZX9/KU0 || K-Bus / Kutsenits (bus) (Slovenia)
|-
| ZX9/DUR || TAM bus (Slovenia)
|-
| ZX9/TV0 || TAM (Tovarna Vozil Maribor) bus (Slovenia)
|-
| ZY1 || Adria (recreational vehicles) (Slovenia)
|-
| ZY9/002 || Gorica (truck trailer) (Slovenia)
|-
| ZZ1 || Tomos motorcycle (Slovenia)
|-
| Z29/555 || Vozila FLuid (truck trailer) (Slovenia)
|-
| Z3D || Tauriga UAB; Tauras trailers (Lithuania)
|-
| Z39/008 || Autogalantas (truck trailer) (Lithuania)
|-
| Z39/009 || Patikima Linija / Rimo (truck trailer) (Lithuania)
|-
| Z6F || Ford Sollers (Russia)
|-
| Z7C || Luidor (bus) (Russia)
|-
| Z7N || KAvZ (bus) (Russia)
|-
| Z7T || RoAZ (bus) (Russia)
|-
| Z7X || Isuzu Rus (Russia)
|-
| Z76 || SEMAZ (Kazakhstan)
|-
| Z8M || Marussia (Russia)
|-
| Z8N || Nissan Manufacturing Rus & Nissan and Datsun models made by AvtoVAZ (Russia)
|-
| Z8P || IRITO
|-
| Z8T || PCMA Rus (Peugeot, Citroen, Mitsubishi) (Russia)
|-
| Z8U || [[w:SsangYong Korando#Third generation (C200; 2010)|Ssangyong Actyon]] made by Sollers (Russia)
|-
| Z8Y || Nasteviya (bus) (Russia)
|-
| Z9B || KuzbassAvto (Hyundai bus) (Russia)
|-
| Z9M || Mercedes-Benz Manufacturing Rus / Mercedes-Benz Trucks Vostok (Russia)
|-
| Z9N || Samotlor-NN (Iveco) (Russia)
|-
| Z94 || Hyundai Motor Manufacturing Rus (Hyundai, Kia) (2008-2023), Solaris Auto - AGR Automotive (2023-) (Russia)
|-
| Z07 || Volgabus (Russia)
|-
| 1A4 1A8 || Chrysler brand MPV/SUV 2006–2009 only
|-
| 1A9/007 || Advance Mixer Inc.
|-
| 1A9/111 || Amerisport Inc. (federalized late model DeTomaso Pantera)
|-
| 1A9/398 || Ameritech (federalized McLaren F1 & Bugatti EB110)
|-
| 1A9/569 || American Custom Golf Cars Inc. (AGC)
|-
| 1AC || American Motors Corporation MPV
|-
| 1AF || American LaFrance truck
|-
| 1AJ || Ajax Manufacturing (truck trailer)
|-
| 1AM || American Motors Corporation car & Renault Alliance 1983 only
|-
| 1BN || Beall Trailers (truck trailer)
|-
| 1B3 || Dodge car 1981–2011
|-
| 1B4 || Dodge MPV/SUV 1981–2002
|-
| 1B6 || Dodge incomplete vehicle 1981–2002
|-
| 1B7 || Dodge truck 1981–2002
|-
| 1B9/133 || Buell Motorcycle Company through mid-1995
|-
| 1B9/274 || Brooks Brothers Trailers
|-
| 1B9/275 || Boydstun Metal Works (truck trailer)
|-
| 1B9/285 || Boss Hoss Cycles
|-
| 1B9/374 || Big Dog Custom Motorcycles through mid-2002
|-
| 1B9/975 || Motus Motorcycles
|-
| 1BA || Blue Bird Corporation bus
|-
| 1BB || Blue Bird Wanderlodge MPV
|-
| 1BD || Blue Bird Corporation incomplete vehicle
|-
| 1BL || Balko, Inc.
|-
| 1C3 || Chrysler brand car 1981–2011
|-
| 1C3 || Chrysler Group (all brands) car (including Lancia) 2012-
|-
| 1C4 || Chrysler brand MPV 1990–2005
|-
| 1C4 || Chrysler Group (all brands) MPV 2012–
|-
| 1C6 || Chrysler Group (all brands) truck 2012–
|-
| 1C8 || Chrysler brand MPV 2001–2005
|-
| 1C9/257 || CEI Equipment Company (truck trailer)
|-
| 1C9/291 || CX Automotive
|-
| 1C9/496 || Carlinville Truck Equipment (truck trailer)
|-
| 1C9/535 || Chance Coach (bus)
|-
| 1C9/737 || Corbin Motors, Inc.
|-
| 1C9/772 || Cozad (truck trailer)
|-
| 1C9/971 || Cool Amphibious Manufacturers International
|-
| 1CM || Checker Motors Corporation
|-
| 1CU || Cushman Haulster (Cushman division of Outboard Marine Corporation)
|-
| 1CY || Crane Carrier Company
|-
| 1CY || Battle Motors, Inc.
|-
| 1D3 || Dodge truck 2002–2009
|-
| 1D4 || Dodge MPV/SUV 2003–2011 only
|-
| 1D7 || Dodge truck 2002–2011
|-
| 1D8 || Dodge MPV/SUV 2003–2009 only
|-
| 1D9/008 || KME Fire Apparatus
|-
| 1D9/628 || Dymac Vehicle Group (low-speed vehicle)
|-
| 1D9/791 || Dennis Eagle, Inc.
|-
| 1DW || Stoughton Trailers (truck trailer)
|-
| 1E9/007 || E.D. Etnyre & Co. (truck trailer)
|-
| 1E9/190 || Electric Transit Inc. (trolleybus)
|-
| 1E9/363 || E-SUV LLC (E-Ride Industries)
|-
| 1E9/456 || Electric Motorsport (GPR-S electric motorcycle)
|-
| 1E9/526 || Epic TORQ
|-
| 1E9/581 || Vetter Razor
|-
| 1EU || Eagle Coach Corporation (bus)
|-
| 1FA || [[../Ford/VIN Codes|Ford]] car
|-
| 1FB || [[../Ford/VIN Codes|Ford]] "bus" (van with more than 3 rows of seats)
|-
| 1FC || [[../Ford/VIN Codes|Ford]] stripped chassis made by Ford
|-
| 1FD || [[../Ford/VIN Codes|Ford]] incomplete vehicle
|-
| 1FM || [[../Ford/VIN Codes|Ford]] MPV/SUV
|-
| 1FT || [[../Ford/VIN Codes|Ford]] truck
|-
| 1FU || Freightliner (truck)
|-
| 1FV || Freightliner (incomplete vehicle)
|-
| 1F1 || Ford SUV - Limousine (through 2009)
|-
| 1F6 || Ford stripped chassis made by Detroit Chassis LLC
|-
| 1F9/037 || Federal Motors Inc.
|-
| 1F9/140 || Ferrara Fire Apparatus (incomplete vehicle)
|-
| 1F9/458 || Faraday Future prototypes
|-
| 1F9/FT1 || FWD Corp.
|-
| 1F9/ST1 || Seagrave Fire Apparatus
|-
| 1F9/ST2 || Seagrave Fire Apparatus
|-
| 1G || [[../GM/VIN Codes|General Motors]] USA
|-
| 1G0 || GMC "bus" (van with more than 3 rows of seats) 1981–1986
|-
| 1G0 || GMC Rapid Transit Series (RTS) bus 1981–1984
|-
| 1G0 || Opel/Vauxhall car 2007–2017
|-
| 1G1 || [[../GM/VIN Codes|Chevrolet]] car
|-
| 1G2 || [[../GM/VIN Codes|Pontiac]] car
|-
| 1G3 || [[../GM/VIN Codes|Oldsmobile]] car
|-
| 1G4 || [[../GM/VIN Codes|Buick]] car
|-
| 1G5 || GMC MPV/SUV 1981–1986
|-
| 1G5 || Pontiac incomplete vehicle 1989-1990, 2003-2006
|-
| 1G6 || [[../GM/VIN Codes|Cadillac]] car
|-
| 1G7 || Pontiac car only sold by GM Canada
|-
| 1G8 || Chevrolet MPV/SUV 1981–1986
|-
| 1G8 || [[../GM/VIN Codes|Saturn]] car 1991–2010
|-
| 1G9/492 || GreenPower Motor Company incomplete vehicle
|-
| 1G9/495 || Google & Waymo
|-
| 1GA || Chevrolet "bus" (van with more than 3 rows of seats)
|-
| 1GB || Chevrolet incomplete vehicle
|-
| 1GC || [[../GM/VIN Codes|Chevrolet]] truck
|-
| 1GD || GMC incomplete vehicle
|-
| 1GE || Cadillac incomplete vehicle
|-
| 1GF || Flxible bus
|-
| 1GG || Isuzu pickup trucks made by GM
|-
| 1GH || GMC Rapid Transit Series (RTS) bus 1985–1986
|-
| 1GH || Oldsmobile MPV/SUV 1990–2004
|-
| 1GH || Holden Acadia 2019–2020
|-
| 1GJ || GMC "bus" (van with more than 3 rows of seats) 1987–
|-
| 1GK || GMC MPV/SUV 1987–
|-
| 1GM || [[../GM/VIN Codes|Pontiac]] MPV
|-
| 1GN || [[../GM/VIN Codes|Chevrolet]] MPV/SUV 1987-
|-
| 1GR || Great Dane Trailers (truck trailer)
|-
| 1GT || [[../GM/VIN Codes|GMC]] Truck
|-
| 1GW || Grumman Olson Kubvan (truck)
|-
| 1GY || [[../GM/VIN Codes|Cadillac]] SUV
|-
| 1HA || Chevrolet incomplete vehicles (Express cutaway) made by Navistar International/International Motors
|-
| 1HD || Harley-Davidson & LiveWire
|-
| 1HF || Honda motorcycle/ATV/UTV
|-
| 1HG || [[../Honda/VIN Codes|Honda]] car made by Honda of America Mfg. in Ohio
|-
| 1HP || International Trucks (complete vehicle - straight truck)
|-
| 1HS || International Trucks & Caterpillar Trucks (complete vehicle - truck tractor)
|-
| 1HT || International Trucks & Caterpillar Trucks & Chevrolet Silverado 4500HD, 5500HD, 6500HD (incomplete vehicle - straight truck)
|-
| 1HV || International or IC Bus (incomplete vehicle - bus)
|-
| 1H9/484 || Hughes Trailers (Based in Canyon, TX) (trailer)
|-
| 1H9/674 || Hines Specialty Vehicle Group
|-
| 1JC || Jeep SUV 1981–1988 (using AMC-style VIN structure)
|-
| 1JJ || Wabash (truck trailer)
|-
| 1JT || Jeep truck 1981–1988 (using AMC-style VIN structure)
|-
| 1JU || Marmon Motor Company (truck)
|-
| 1J4 || Jeep SUV 1989–2011 (using Chrysler-style VIN structure)
|-
| 1J7 || Jeep truck 1989–1992 (using Chrysler-style VIN structure)
|-
| 1J8 || Jeep SUV 2002–2011 (using Chrysler-style VIN structure)
|-
| 1KB || Holiday Rambler Corp. 1981-2010 (trailer)
|-
| 1K9/058 || Kovatech Mobile Equipment (fire engine)
|-
| 1LH || Landoll (truck trailer)
|-
| 1LJ || Lincoln incomplete vehicle
|-
| 1LN || [[../Ford/VIN Codes|Lincoln]] car
|-
| 1LV || Lectra Motors
|-
| 1L0 || Lufkin Trailers
|-
| 1L1 || Lincoln car – limousine
|-
| 1L9/155 || LA Exotics
|-
| 1L9/234 || Laforza
|-
| 1MB || Mercedes-Benz Truck Co.
|-
| 1ME || [[../Ford/VIN Codes|Mercury]] car
|-
| 1MR || Continental Mark VI & VII 1981–1985 & Continental sedan 1982–1985
|-
| 1M0 || John Deere Gator
|-
| 1M1 || Mack Truck USA (truck)
|-
| 1M2 || Mack Truck USA (incomplete vehicle)
|-
| 1M3 || Mack Truck USA (glider)
|-
| 1M8 || Motor Coach Industries (bus)
|-
| 1M9/089 || Mauck Special Vehicles (bus)
|-
| 1M9/682 || Mosler Automotive
|-
| 1M9/816 || Proterra Through mid-2019
|-
| 1N4 || Nissan car
|-
| 1N6 || Nissan truck
|-
| 1N9/019 || Neoplan USA
|-
| 1N9/084 || Eldorado National (California)
|-
| 1N9/140 || North American Bus Industries (bus)
|-
| 1N9/393 || Nikola Corporation (truck)
|-
| 1NK || Kenworth (incomplete vehicle)
|-
| 1NL || Gulf Stream Coach (recreational vehicles)
|-
| 1NN || Monon made by Evans Products Co. (truck trailer)
|-
| 1NP || Peterbilt (incomplete vehicle)
|-
| 1NX || Toyota car made by NUMMI
|-
| 1P3 || Plymouth car
|-
| 1P4 || Plymouth MPV/SUV
|-
| 1P7 || Plymouth Scamp
|-
| 1P9/038 || Hawk Vehicles, Inc. (Trihawk motorcycles)
|-
| 1P9/213 || Panoz
|-
| 1P9/255 || Pinson Truck Equipment Company (truck trailer)
|-
| 1PM || Polar Tank Trailer (truck trailer)
|-
| 1PT || Trailmobile Trailer Corporation (truck trailer)
|-
| 1PY || John Deere USA
|-
| 1RF || Roadmaster, Monaco Coach Corporation (incomplete vehicle)
|-
| 1RN || Reitnouer (truck trailer)
|-
| 1R9/956 || Reede Fabrication and Design (motorcycles)
|-
| 1ST || Airstream (recreational vehicles)
|-
| 1S1 || Strick Trailers (truck trailer)
|-
| 1S9/003 || Sutphen Corporation (fire engines - truck)
|-
| 1S9/009|| Superior Trailer Works (truck trailer)
|-
| 1S9/098 || Scania AB (Scania CN112 bus made in Orange, CT)
|-
| 1S9/842 || Saleen S7
|-
| 1S9/260 || Stairs Welding RL (truck trailer)
|-
| 1S9/901 || Suckerpunch Sallys, LLC
|-
| 1S9/944 || SSC North America
|-
| 1TD || Timpte (truck trailer)
|-
| 1TK || Trail King (truck trailer)
|-
| 1TD || Transcraft Corporation (truck trailer)
|-
| 1T7 || Thomas Built Buses
|-
| 1T8 || Thomas Built Buses
|-
| 1T9/072 || The Trailer Co. (truck trailer)
|-
| 1T9/717 || Thunder Mountain Custom Cycles
|-
| 1T9/825 || TICO Manufacturing Company (truck)
|-
| 1T9/899 || Tomcar USA
|-
| 1T9/970 || Three Two Chopper
|-
| 1TC || Coachmen Recreational Vehicle Co., LLC
|-
| 1TU || Transportation Manufacturing Corporation
|-
| 1UJ || Jayco, Inc.
|-
| 1UT || AM General military trucks, Jeep DJ made by AM General
|-
| 1UY || Utility Trailer (truck trailer)
|-
| 1VH || Orion Bus Industries
|-
| 1VW || Volkswagen car
|-
| 1V1 || Volkswagen truck
|-
| 1V2 || Volkswagen SUV
|-
| 1V9/048 || Vector Aeromotive
|-
| 1V9/113 || Vantage Vehicle International Inc (low-speed vehicle)
|-
| 1V9/190 || Vanderhall Motor Works
|-
| 1WA || White Motor Company (Autocar brand truck)
|-
| 1WB || White Motor Company (Autocar brand incomplete vehicle)
|-
| 1WD || White Motor Company (Autocar brand glider)
|-
| 1WT || Winnebago Industries: Winnebago M.P.V.
|-
| 1WU || White Motor Company (White brand truck)
|-
| 1WV || Winnebago Industries: Winnebago M.P.V. - Class C Motorhome built on VW chassis & front cab [Winnebago Rialta ('95-'96)]
|-
| 1WW || Winnebago Industries: Winnebago M.P.V. - Class B Motorhome built on Renault chassis [Winnebago LeSharo, Centauri, Itasca Phasar]
|-
| 1WX || White Motor Company (White brand incomplete vehicle)
|-
| 1WY || White Motor Company (White brand glider)
|-
| 1W1 || Wilson Trailer Co. (truck trailer)
|-
| 1W5 || Western Recreational Vehicles (Alpenlite)
|-
| 1W8 || Witzco (truck trailer)
|-
| 1W9/010 || Weld-It Company (truck trailer)
|-
| 1W9/485 || Wheego Electric Cars
|-
| 1W9/488 || Certified Stainless Services Inc. DBA West-Mark (truck trailer) (2010 & later)
|-
| 1XA || Excalibur Automobile Corporation
|-
| 1XK || Kenworth (truck)
|-
| 1XM || Renault Alliance/GTA/Encore 1984–1987
|-
| 1XP || Peterbilt (truck)
|-
| 1Y1 || Chevrolet/Geo car made by NUMMI
|-
| 1YJ || Rokon International, Inc.
|-
| 1YV || [[../Ford/VIN Codes|Mazda made by Mazda Motor Manufacturing USA/AutoAlliance International]]
|-
| 1ZV || [[../Ford/VIN Codes|Ford made by Mazda Motor Manufacturing USA/AutoAlliance International]]
|-
| 1ZW || [[../Ford/VIN Codes|Mercury made by AutoAlliance International]]
|-
| 1Z3 1Z7 || Mitsubishi Raider
|-
| 1Z9/170 || [[w:Orange County Choppers|Orange County Choppers]]
|-
| 10B || Brenner Tank (truck trailer)
|-
| 10R || E-Z-GO
|-
| 10T || Oshkosh Corporation
|-
| 11H || Hendrickson Mobile Equipment, Inc. (fire engines - incomplete vehicle)
|-
| 11V || Kalmar Solutions (Truck - Terminal Tractor)
|-
| 12A || Avanti
|-
| 137 || AM General Hummer & Hummer H1
|-
| 13N || Fontaine (truck trailer)
|-
| 15G || Gillig bus
|-
| 16C || Clenet Coachworks
|-
| 16W || Certified Stainless Services Inc. DBA West-Mark (truck trailer) (prior to 2010)
|-
| 16X || Vixen 21 motorhome
|-
| 17N || John Deere incomplete vehicle (RV chassis)
|-
| 18X || Western Recreational Vehicles
|-
| 19U || Acura car made by Honda of America Mfg. in Ohio
|-
| 19V || Acura car made by Honda Manufacturing of Indiana
|-
| 19X || Honda car made by Honda Manufacturing of Indiana
|-
| 2A3 || Imperial
|-
| 2A4 2A8 || Chrysler brand MPV/SUV 2006–2011 only
|-
| 2AY 2AZ || Hino
|-
| 2BC || Jeep Wrangler (YJ) 1987–1988 (using AMC-style VIN structure)
|-
| 2BP || Ski-Doo
|-
| 2BV || Can-Am & Bombardier ATV
|-
| 2BW || Can-Am Commander E LSV
|-
| 2BX || Can-Am Spyder & Canyon 3-wheelers
|-
| 2BZ || Can-Am Freedom Trailer for Can-Am Spyder & Canyon
|-
| 2B1 || Orion Bus Industries
|-
| 2B3 || Dodge car 1981–2011
|-
| 2B4 || Dodge MPV 1981–2002
|-
| 2B5 || Dodge "bus" (van with more than 3 rows of seats) 1981–2002
|-
| 2B6 || Dodge incomplete vehicle 1981–2002
|-
| 2B7 || Dodge truck 1981–2002
|-
| 2B9/001 || BWS Manufacturing (truck trailer)
|-
| 2C1 || Geo/Chevrolet car made by CAMI Automotive
|-
| 2C3 || Chrysler brand car 1981–2011
|-
| 2C3 || Chrysler Group (all brands) car (including Lancia) 2012-
|-
| 2C4 || Chrysler brand MPV/SUV 2000–2005
|-
| 2C4 || Chrysler Group (all brands) MPV (including Lancia Voyager & Volkswagen Routan) 2012-
|-
| 2C7 || Pontiac car made by CAMI Automotive only sold by GM Canada
|-
| 2C8 || Chrysler brand MPV/SUV 2001–2005
|-
| 2C9/145 || Campagna Motors
|-
| 2C9/197 || Canadian Electric Vehicles
|-
| 2CC || American Motors Corporation MPV
|-
| 2CG || Asüna/Pontiac SUV made by CAMI Automotive only sold by GM Canada
|-
| 2CK || GMC Tracker SUV made by CAMI Automotive only sold by GM Canada 1990–1991 only
|-
| 2CK || Pontiac Torrent SUV made by CAMI Automotive 2006–2009 only
|-
| 2CM || American Motors Corporation car
|-
| 2CN || Geo/Chevrolet SUV made by CAMI Automotive 1990–2011 only
|-
| 2CT || GMC Terrain SUV made by CAMI Automotive 2010–2011 only
|-
| 2D4 || Dodge MPV 2003–2011 only
|-
| 2D6 || Dodge incomplete vehicle 2003
|-
| 2D7 || Dodge truck 2003
|-
| 2D8 || Dodge MPV 2003–2011 only
|-
| 2DG || Ontario Drive & Gear
|-
| 2DM || Di-Mond Trailers (truck trailer)
|-
| 2DN || Dynasty Electric Car Corporation
|-
| 2EZ || Electra Meccanica Vehicles Corp. (Solo)
|-
| 2E3 || Eagle car 1989–1997 (using Chrysler-style VIN structure)
|-
| 2E4 || 2011 Lancia MPV (Voyager)
|-
| 2E9/080 || Electra Meccanica Vehicles Corp. (Solo)
|-
| 2FA || [[../Ford/VIN Codes|Ford]] car
|-
| 2FH || Zenn Motor Co., Ltd. (low-speed vehicle)
|-
| 2FM || [[../Ford/VIN Codes|Ford]] MPV/SUV
|-
| 2FT || [[../Ford/VIN Codes|Ford]] truck
|-
| 2FU || Freightliner (truck)
|-
| 2FV || Freightliner (incomplete vehicle)
|-
| 2FW || Sterling Trucks (truck-complete vehicle)
|-
| 2FY || New Flyer
|-
| 2FZ || Sterling Trucks (incomplete vehicle)
|-
| 2Gx || [[../GM/VIN Codes|General Motors]] Canada
|-
| 2G0 || GMC "bus" (van with more than 3 rows of seats) 1981–1986
|-
| 2G1 || [[../GM/VIN Codes|Chevrolet]] car
|-
| 2G2 || [[../GM/VIN Codes|Pontiac]] car
|-
| 2G3 || [[../GM/VIN Codes|Oldsmobile]] car
|-
| 2G4 || [[../GM/VIN Codes|Buick]] car
|-
| 2G5 || GMC MPV 1981–1986
|-
| 2G5 || Chevrolet BrightDrop / BrightDrop Zevo truck 2023-2026
|-
| 2G6 || [[../GM/VIN Codes|Cadillac]] car
|-
| 2G7 || Pontiac car only sold by GM Canada
|-
| 2G8 || Chevrolet MPV 1981–1986
|-
| 2GA || Chevrolet "bus" (van with more than 3 rows of seats)
|-
| 2GB || Chevrolet incomplete vehicle
|-
| 2GC || Chevrolet truck
|-
| 2GD || GMC incomplete vehicle
|-
| 2GE || Cadillac incomplete vehicle
|-
| 2GH || GMC GM New Look bus & GM Classic series bus
|-
| 2GJ || GMC "bus" (van with more than 3 rows of seats) 1987–
|-
| 2GK || GMC MPV/SUV 1987–
|-
| 2GN || Chevrolet MPV/SUV 1987-
|-
| 2GT || GMC truck
|-
| 2HG || [[../Honda/VIN Codes|Honda]] car made by Honda of Canada Manufacturing
|-
| 2HH || Acura car made by Honda of Canada Manufacturing
|-
| 2HJ || [[../Honda/VIN Codes|Honda]] truck made by Honda of Canada Manufacturing
|-
| 2HK || [[../Honda/VIN Codes|Honda]] MPV/SUV made by Honda of Canada Manufacturing
|-
| 2HM || Hyundai Canada
|-
| 2HN || Acura SUV made by Honda of Canada Manufacturing
|-
| 2HP || International Trucks (complete vehicle - straight truck)
|-
| 2HS || International Trucks (complete vehicle - truck tractor)
|-
| 2HT || International Trucks (incomplete vehicle - straight truck)
|-
| 2HV || International or IC Bus (incomplete vehicle - bus)
|-
| 2J4 || Jeep Wrangler (YJ) 1989–1992 (using Chrysler-style VIN structure)
|-
| 2L1 || Lincoln incomplete vehicle – limo
|-
| 2LD || Triple E Canada Ltd.
|-
| 2LJ || Lincoln incomplete vehicle – hearse
|-
| 2LM || Lincoln SUV
|-
| 2LN || Lincoln car
|-
| 2M1 || Mack Trucks Canada (truck)
|-
| 2M2 || Mack Trucks Canada (incomplete vehicle)
|-
| 2M3 || Mack Truck Canada (glider)
|-
| 2ME || [[../Ford/VIN Codes|Mercury]] car
|-
| 2MG || Motor Coach Industries (Produced from Sept. 1, 2008 on)
|-
| 2MH || [[../Ford/VIN Codes|Mercury]] incomplete vehicle
|-
| 2MR || [[../Ford/VIN Codes|Mercury]] MPV
|-
| 2M9/044 || Westward Industries
|-
| 2M9/058 || Motor Coach Industries
|-
| 2NK || Kenworth incomplete vehicle
|-
| 2NP || Peterbilt incomplete vehicle
|-
| 2NV || Nova Bus
|-
| 2P3 || Plymouth car
|-
| 2P4 || Plymouth MPV 1981–2000
|-
| 2P5 || Plymouth "bus" (van with more than 3 rows of seats) 1981–1983
|-
| 2P9/001 || Prevost 1981–1995
|-
| 2PC || Prevost 1996-
|-
| 2S2 || Suzuki car made by CAMI Automotive
|-
| 2S3 || Suzuki SUV made by CAMI Automotive
|-
| 2TU || Tri-Star Industries Limited
|-
| 2T1 || [[../Toyota/VIN Codes|Toyota]] car made by TMMC
|-
| 2T2 || Lexus SUV made by TMMC
|-
| 2T3 || [[../Toyota/VIN Codes|Toyota]] SUV made by TMMC
|-
| 2T9/206 || Triple E Canada Ltd.
|-
| 2V4 || Volkswagen Routan made by Chrysler Canada
|-
| 2V8 || Volkswagen Routan made by Chrysler Canada
|-
| 2W9/044 || Westward Industries
|-
| 2WK || Western Star (truck)
|-
| 2WL || Western Star (incomplete vehicle)
|-
| 2WM || Western Star (glider)
|-
| 2XK || Kenworth (truck)
|-
| 2XM || Eagle Premier 1988 only (using AMC-style VIN structure)
|-
| 2XP || Peterbilt (truck)
|-
| 3A4 3A8 || Chrysler brand MPV 2006–2010 only
|-
| 3A9/050 || MARGO (truck trailer)
|-
| 3AK || Freightliner Trucks (truck)
|-
| 3AL || Freightliner Trucks (incomplete vehicle)
|-
| 3AW || Fruehauf de Mexico (truck trailer)
|-
| 3AX || Scania Mexico
|-
| 3BE || Scania Mexico (buses)
|-
| 3BH || Western Star 3700 (truck) made by DINA S.A.
|-
| 3BH || Western Star (truck)
|-
| 3BJ || Western Star 3700 (incomplete vehicle) made by DINA S.A.
|-
| 3BJ || Western Star (incomplete vehicle)
|-
| 3BK || Kenworth (incomplete vehicle)
|-
| 3BM || Motor Coach Industries bus made by DINA S.A.
|-
| 3BP || Peterbilt (incomplete vehicle)
|-
| 3B3 || Dodge car 1981–2011
|-
| 3B4 || Dodge SUV 1986–1993
|-
| 3B6 || Dodge incomplete vehicle 1981–2002
|-
| 3B7 || Dodge truck 1981–2002
|-
| 3C3 || Chrysler brand car 1981–2011
|-
| 3C3 || Chrysler Group (all brands) car (including Fiat) 2012-
|-
| 3C4 || Chrysler brand MPV 2001–2005
|-
| 3C4 || Chrysler Group (all brands) MPV (including Fiat) 2012-
|-
| 3C6 || Chrysler Group (all brands) truck 2012–
|-
| 3C7 || Chrysler Group (all brands) incomplete vehicle 2012–
|-
| 3C8 || Chrysler brand MPV 2001–2005
|-
| 3CA || Chrysler brand MPV 2001 (PT Cruiser w/serial# 232057-265662)
|-
| 3CE || Volvo Buses de Mexico
|-
| 3CG || KTMMEX S.A. de C.V.
|-
| 3CZ || Honda SUV made by Honda de Mexico
|-
| 3D2 || Dodge incomplete vehicle 2007–2009
|-
| 3D3 || Dodge truck 2006–2009
|-
| 3D4 || Dodge SUV 2009–2011
|-
| 3D6 || Dodge incomplete vehicle 2003–2011
|-
| 3D7 || Dodge truck 2002–2011
|-
| 3EL || ATRO (truck trailer)
|-
| 3E4 || 2011 Fiat SUV (Freemont)
|-
| 3FA || [[../Ford/VIN Codes|Ford]] car
|-
| 3FC || Ford stripped chassis made by Ford & IMMSA
|-
| 3FE || [[../Ford/VIN Codes|Ford]] Mexico
|-
| 3FM || [[../Ford/VIN Codes|Ford]] MPV/SUV
|-
| 3FN || Ford F-650/F-750 made by Blue Diamond Truck Co. (truck)
|-
| 3FR || Ford F-650/F-750 & Ford LCF made by Blue Diamond Truck Co. (incomplete vehicle)
|-
| 3FT || [[../Ford/VIN Codes|Ford]] truck
|-
| 3F6 || Sterling Bullet
|-
| 3G || [[../GM/VIN Codes|General Motors]] Mexico
|-
| 3G0 || Saab 9-4X 2011
|-
| 3G0 || Holden Equinox 2018–2020
|-
| 3G1 || [[../GM/VIN Codes|Chevrolet]] car
|-
| 3G2 || [[../GM/VIN Codes|Pontiac]] car
|-
| 3G4 || [[../GM/VIN Codes|Buick]] car
|-
| 3G5 || [[../GM/VIN Codes|Buick]] SUV
|-
| 3G7 || [[../GM/VIN Codes|Pontiac]] SUV
|-
| 3GA || JAC models assembled by Giant Motors in Mexico
|-
| 3GC || Chevrolet truck
|-
| 3GK || GMC SUV
|-
| 3GM || Holden Suburban
|-
| 3GN || Chevrolet SUV
|-
| 3GP || Honda Prologue EV made by GM
|-
| 3GS || Saturn SUV
|-
| 3GT || GMC truck
|-
| 3GY || Cadillac SUV
|-
| 3H1 || Honda motorcycle/UTV
|-
| 3H3 || Hyundai de Mexico, S.A. de C.V. for Hyundai Translead (truck trailers)
|-
| 3HA || International Trucks (incomplete vehicle - straight truck) made by Blue Diamond Truck Co. 2011-2015
|-
| 3HA || International Trucks (incomplete vehicle - straight truck) made by Navistar Mexico/International Motors Mexico 2016-
|-
| 3HC || International Trucks (complete vehicle - truck tractor) made by Blue Diamond Truck Co. 2011-2015
|-
| 3HC || International Trucks (complete vehicle - truck tractor) made by Navistar Mexico/International Motors Mexico 2016-
|-
| 3HD || Acura SUV made by Honda de Mexico
|-
| 3HG || [[../Honda/VIN Codes|Honda]] car made by Honda de Mexico
|-
| 3HR || International Trucks (complete vehicle - truck)
|-
| 3HS || International Trucks & Caterpillar Trucks (complete vehicle - truck tractor)
|-
| 3HT || International Trucks & Caterpillar Trucks (incomplete vehicle - straight truck)
|-
| 3HV || International (incomplete vehicle - bus)
|-
| 3JB || BRP Mexico (Can-Am ATV/UTV & Can-Am Ryker 3-wheeler)
|-
| 3JC || BRP Mexico (Can-Am Origin & Pulse electric 2-wheel motorcycles)
|-
| 3KM || Kia/Hyundai MPV/SUV made by KMMX
|-
| 3KP || Kia/Hyundai car made by KMMX
|-
| 3LN || Lincoln car
|-
| 3MA || Mercury car (1988-1995)
|-
| 3MD || Mazda de Mexico car (Mazda 2)
|-
| 3ME || Mercury car (1996-2011)
|-
| 3MF || BMW M car
|-
| 3MG || Isuzu Motors de Mexico
|-
| 3MJ || Mazda CX-3 (Mazda de Mexico)
|-
| 3MV || Mazda de Mexico SUV (Mazda CX-30)
|-
| 3MW || BMW car
|-
| 3MY || Toyota car made by Mazda de Mexico Vehicle Operation
|-
| 3MZ || Mazda de Mexico car (Mazda 3)
|-
| 3N1 || Nissan Mexico car
|-
| 3N6 || Nissan Mexico truck & Chevrolet City Express
|-
| 3N8 || Nissan Mexico MPV
|-
| 3NS || Polaris Industries ATV
|-
| 3NE || Polaris Industries UTV
|-
| 3P3 || Plymouth car
|-
| 3PC || Infiniti SUV made by COMPAS
|-
| 3TM || Toyota truck made by TMMBC
|-
| 3TY || Toyota truck made by TMMGT
|-
| 3VV || Volkswagen Mexico SUV
|-
| 3VW || Volkswagen Mexico car
|-
| 3WK || Kenworth truck
|-
| 3WP || Peterbilt truck
|-
| 3X1 || Mack Truck Mexico (truck)
|-
| 3X2 || Mack Truck Mexico (incomplete vehicle)
|-
| 4A3 || Mitsubishi Motors car
|-
| 4A4 || Mitsubishi Motors SUV
|-
| 4B3 || Dodge car made by Diamond-Star Motors factory
|-
| 4B9/038 || BYD Coach & Bus LLC
|-
| 4C3 || Chrysler car made by Diamond-Star Motors factory
|-
| 4C6 || Reinke Manufacturing Company (truck trailer)
|-
| 4C9/272 || Christini Technologies (motorcycle)
|-
| 4C9/561 || Czinger
|-
| 4C9/626 || Canoo Inc.
|-
| 4CD || Oshkosh Chassis Division incomplete vehicle (RV chassis)
|-
| 4DR || IC Bus (complete vehicle - bus)
|-
| 4E3 || Eagle car made by Diamond-Star Motors factory
|-
| 4EN || E-ONE, Inc. (fire engines - truck)
|-
| 4EZ || KZ Recreational Vehicles (trailer)
|-
| 4F2 || Mazda SUV made by Ford
|-
| 4F4 || Mazda truck made by Ford
|-
| 4G1 || Chevrolet Cavalier convertible made by Genasys L.C. – a GM/ASC joint venture
|-
| 4G2 || Pontiac Sunfire convertible made by Genasys L.C. – a GM/ASC joint venture
|-
| 4G3 || Toyota Cavalier made by GM
|-
| 4G5 || General Motors EV1
|-
| 4GD || WhiteGMC Brigadier 1988–1989 made by GM
|-
| 4GD || Opel/Vauxhall Sintra
|-
| 4GL || Buick incomplete vehicle
|-
| 4GT || Isuzu incomplete vehicle built by GM
|-
| 4JG || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] SUV
|-
| 4J8 || LBT, Inc. (truck trailer)
|-
| 4KA || IC Bus (complete vehicle - truck)
|-
| 4KB || Chevrolet W-Series (gas engine only) made by GM (Incomplete Vehicle - medium duty)
|-
| 4KD || GMC W-Series (gas engine only) made by GM (Incomplete Vehicle - medium duty)
|-
| 4KL || Isuzu N-Series (gas engine only) made by GM (Incomplete Vehicle - medium duty)
|-
| 4LM || Capacity Trucks (truck) [terminal tractors]
|-
| 4M2 || [[../Ford/VIN Codes|Mercury]] MPV/SUV
|-
| 4M9/220 || Meyers Manx, LLC (Manx 2.0 EV) [Passenger Car - Replica]
|-
| 4ML || Oshkosh Trailer Division
|-
| 4MZ || Buell Motorcycle Company (Mid-1995 – )
|-
| 4N2 || Nissan Quest made by Ford
|-
| 4NU || Isuzu Ascender made by GM
|-
| 4PR || Hughes Trailers of Jackson (trailer)
|-
| 4P1 || Pierce Manufacturing Inc. USA
|-
| 4P3 || Plymouth car made by Diamond-Star Motors factory 1990–1994
|-
| 4P3 || Mitsubishi Motors SUV made by Mitsubishi Motor Manufacturing of America 2013–2015 for export only
|-
| 4RK || Nova Bus & Prevost made by Nova Bus (US) Inc.
|-
| 4S1 || Isuzu truck made by Subaru Isuzu Automotive
|-
| 4S2 || Isuzu SUV made by Subaru Isuzu Automotive & 2nd gen. Holden Frontera made by SIA
|-
| 4S3 || [[../Subaru/VIN Codes|Subaru]] car
|-
| 4S4 || [[../Subaru/VIN Codes|Subaru]] SUV/MPV
|-
| 4S6 || Honda SUV made by Subaru Isuzu Automotive
|-
| 4S7 || Spartan Motors incomplete vehicle
|-
| 4S9/197 || Smith Electric Vehicles
|-
| 4S9/345 || Satellite Suites (trailer)
|-
| 4S9/419 || Spartan Motors truck
|-
| 4S9/454 || Scuderia Cameron Glickenhaus passenger car
|-
| 4S9/520 || Signature Autosport, LLC (Osprey Custom Cars)
|-
| 4S9/542 || Scuderia Cameron Glickenhaus SCG Boot (M.P.V.)
|-
| 4S9/544 || Scuderia Cameron Glickenhaus passenger car
|-
| 4S9/559 || Spartan Fire, LLC truck (formerly Spartan ER)
|-
| 4S9/560 || Spartan Fire, LLC incomplete vehicle (formerly Spartan ER)
|-
| 4S9/569 || SC Autosports, LLC (Kandi)
|-
| 4TA || [[../Toyota/VIN Codes|Toyota]] truck made by NUMMI
|-
| 4T1 || [[../Toyota/VIN Codes|Toyota]] car made by Toyota Motor Manufacturing Kentucky
|-
| 4T3 || [[../Toyota/VIN Codes|Toyota]] MPV/SUV made by Toyota Motor Manufacturing Kentucky
|-
| 4T4 || [[../Toyota/VIN Codes|Toyota]] car made by Subaru of Indiana Automotive
|-
| 4T9/208 || Xos, Inc.
|-
| 4T9/228 || Lumen Motors
|-
| 4UF || Arctic Cat Inc.
|-
| 4US || BMW car
|-
| 4UZ || Freightliner Custom Chassis Corporation & <br /> gas-powered Mitsubishi Fuso trucks assembled by Freightliner Custom Chassis & <br /> Thomas Built Buses FS-65 & Saf-T-Liner C2
|-
| 4V0 || Crossroads RV (recreational vehicles)
|-
| 4V1 || WhiteGMC (truck) 1988-1995
|-
| 4V2 || WhiteGMC (incomplete vehicle) 1988-1995
|-
| 4V3 || WhiteGMC (glider) 1988-1995
|-
| 4V1 || Volvo Trucks North America [low cab-over engine] (truck) 2000-2003
|-
| 4V2 || Volvo Trucks North America [low cab-over engine] (incomplete vehicle) 2000-2003
|-
| 4V4 || Volvo Trucks North America [conventional] (truck) 1996+
|-
| 4V5 || Volvo Trucks North America [conventional] (incomplete vehicle) 1996+
|-
| 4V6 || Volvo Trucks North America (glider)
|-
| 4VA || Volvo Trucks North America [conventional- Class 7 w/air brakes] (truck) 1997-1999
|-
| 4VB || Volvo Trucks North America [conventional- Class 7 w/air brakes] (incomplete vehicle) 1997-1999
|-
| 4VC || Volvo Trucks North America [conventional- Class 7 w/hydraulic brakes] (incomplete vehicle)
|-
| 4VD || Volvo Trucks North America [low cab-over engine- Class 7 w/air brakes] (truck)
|-
| 4VE || Volvo Trucks North America [low cab-over engine- Class 7 w/air brakes] (incomplete vehicle)
|-
| 4VG || Volvo Trucks North America [conventional- Class 8 w/air brakes] (truck) 1997-1999
|-
| 4VH || Volvo Trucks North America [conventional- Class 8 w/air brakes] (incomplete vehicle) 1997-1999
|-
| 4VJ || Volvo Trucks North America [high cab-over engine- Class 8 w/air brakes] (truck)
|-
| 4VK || Volvo Trucks North America [high cab-over engine- Class 8 w/air brakes] (incomplete vehicle)
|-
| 4VL || Volvo Trucks North America [low cab-over engine- Class 8 w/air brakes] (truck)
|-
| 4VM || Volvo Trucks North America [low cab-over engine- Class 8 w/air brakes] (incomplete vehicle)
|-
| 4VZ || Spartan Motors/The Shyft Group (incomplete vehicle – bare chassis only)
|-
| 4WW || Wilson Trailer Sales
|-
| 4W1 || '24+ Chevrolet Suburban HD made by GM Defense for US govt. in Concord, NC
|-
| 4W5 || Acura ZDX EV made by GM
|-
| 4XA || Polaris Inc.
|-
| 4X4 || Forest River
|-
| 4YD || KeyStone RV Company (recreational vehicle)
|-
| 4YM || Carry-On Trailer, Inc.
|-
| 4YM || Anderson Manufacturing (trailer)
|-
| 4Z3 || American LaFrance truck
|-
| 43C || Consulier
|-
| 44K || HME Inc. (fire engines - incomplete vehicle) (HME=Hendrickson Mobile Equipment)
|-
| 46G || Gillig incomplete vehicle
|-
| 46J || Federal Motors Inc
|-
| 478 || Honda ATV
|-
| 480 || Sterling Trucks (truck)
|-
| 49H || Sterling Trucks (incomplete vehicle)
|-
| 5AS || Global Electric Motorcars (GEM) 1999-2011
|-
| 5AX || Armor Chassis (truck trailer)
|-
| 5A4 || Load Rite Trailers Inc.
|-
| 5BP || Solectria
|-
| 5BZ || Nissan "bus" (van with more than 3 rows of seats)
|-
| 5B4 || Workhorse Custom Chassis, LLC incomplete vehicle (RV chassis)
|-
| 5CD || Indian Motorcycle Company of America (Gilroy, CA)
|-
| 5CJ || Western Star Trucks (incomplete vehicle)
|-
| 5CK || Western Star Trucks (truck)
|-
| 5CX || Shelby Series 1
|-
| 5DF || Thomas Dennis Company LLC
|-
| 5DG || Terex Advance Mixer, Inc. (Formerly Advance Mixer, Inc.) (truck)
|-
| 5EH || Excelsior-Henderson Motorcycle
|-
| 5EO || Cottrell (truck trailer)
|-
| 5FC || Columbia Vehicle Group (Columbia, Tomberlin) (low-speed vehicles)
|-
| 5FN || Honda MPV/SUV made by Honda Manufacturing of Alabama
|-
| 5FP || Honda truck made by Honda Manufacturing of Alabama
|-
| 5FR || Acura SUV made by Honda Manufacturing of Alabama
|-
| 5FT || Feeling Trailers
|-
| 5FY || New Flyer
|-
| 5GA || Buick MPV/SUV
|-
| 5GD || Daewoo G2X
|-
| 5GN || Hummer H3T
|-
| 5GR || Hummer H2
|-
| 5GT || Hummer H3
|-
| 5GZ || Saturn MPV/SUV
|-
| 5G8 || Holden Volt
|-
| 5HD || Harley-Davidson for export markets
|-
| 5HT || Heil Trailer (truck trailer)
|-
| 5J1 || Big Dog Motorcycles (Mid-2002 – )
|-
| 5J5 || Club Car (low-speed vehicle)
|-
| 5J6 || Honda SUV made by Honda of America Mfg. in Ohio
|-
| 5J8 || Acura SUV made by Honda of America Mfg. in Ohio
|-
| 5KB || Honda car made by Honda Manufacturing of Alabama
|-
| 5KJ || Western Star Trucks (truck)
|-
| 5KK || Western Star Trucks (incomplete vehicle)
|-
| 5KM || Vento Motorcycles
|-
| 5KT || Karavan Trailers
|-
| 5L1 || [[../Ford/VIN Codes|Lincoln]] SUV - Limousine (2004–2009)
|-
| 5L5 || American IronHorse Motorcycle
|-
| 5LD || Ford & Lincoln incomplete vehicle – limousine (2010–2014)
|-
| 5LM || [[../Ford/VIN Codes|Lincoln]] SUV
|-
| 5LT || [[../Ford/VIN Codes|Lincoln]] truck
|-
| 5MZ || Buell Motorcycle Company for export markets
|-
| 5N1 || Nissan & Infiniti SUV
|-
| 5N3 || Infiniti SUV
|-
| 5NH || Forest River
|-
| 5NM || Hyundai SUV made by HMMA
|-
| 5NP || Hyundai car made by HMMA
|-
| 5NT || Hyundai truck made by HMMA
|-
| 5PV || Hino incomplete vehicle made by Hino Motors Manufacturing USA
|-
| 5RJ || International MXT made by Android Industries - Springfield LLC
|-
| 5RX || Heartland Recreational Vehicles
|-
| 5S3 || Saab 9-7X
|-
| 5SA || Suzuki Manufacturing of America Corp. (ATV)
|-
| 5SX || American LaFrance incomplete vehicle (Condor)
|-
| 5TB || [[../Toyota/VIN Codes|Toyota]] truck made by TMMI
|-
| 5TD || Toyota MPV/SUV & Lexus TX made by TMMI
|-
| 5TE || Toyota truck made by NUMMI
|-
| 5TF || Toyota truck made by TMMTX
|-
| 5TU || Construction Trailer Specialist (truck trailer)
|-
| 5UM || BMW M car
|-
| 5UX || BMW SUV
|-
| 5VC || Autocar incomplete vehicle
|-
| 5VF || American Electric Vehicle Company (low-speed vehicle)
|-
| 5VK || Great Northern Trailer Works (truck trailer)
|-
| 5VP || Victory Motorcycles
|-
| 5V4 || Autocar truck
|-
| 5V8 || Vanguard National (truck trailer)
|-
| 5WE || IC Bus (incomplete vehicle - bus or truck)
|-
| 5XX || Kia car made by KMMG
|-
| 5XY || Kia/Hyundai SUV made by KMMG
|-
| 5YA || Indian Motorcycle Company (Kings Mountain, NC)
|-
| 5YF || Toyota car made by TMMMS
|-
| 5YJ || Tesla, Inc. passenger car (only used for US-built Model S and Model 3 starting from Nov, 1st 2021)
|-
| 5YM || BMW M SUV
|-
| 5YN || Cruise Car, Inc.
|-
| 5Y2 || Pontiac Vibe made by NUMMI
|-
| 5Y4 || Yamaha Motor Motor Mfg. Corp. of America (ATV, UTV)
|-
| 5ZT || Forest River (recreational vehicles)
|-
| 5ZU || Greenkraft (truck)
|-
| 5Z6 || Suzuki Equator (truck) made by Nissan
|-
| 50E || Lucid Motors passenger car
|-
| 50G || Karma Automotive
|-
| 50H || Norstar Company (truck trailers, truck beds)
|-
| 516 || Autocar truck
|-
| 51R || Brammo Motorcycles
|-
| 51T || Monaco RV LLC/Navistar RV LLC: Monaco (trailer)
|-
| 51U || Monaco RV LLC/Navistar RV LLC: Holiday Rambler 2010- (trailer)
|-
| 51V || Monaco RV LLC/Navistar RV LLC: R-Vision (trailer)
|-
| 51X || Monaco RV LLC/Navistar RV LLC: McKenzie (trailer)
|-
| 51Z || Monaco RV LLC/Navistar RV LLC: Monaco RV [Roadmaster Chassis] (incomplete vehicle)
|-
| 522 || GreenGo Tek (low-speed vehicle)
|-
| 523 || VPG (The Vehicle Production Group)
|-
| 52C || GEM subsidiary of Polaris Inc.
|-
| 537 || Azure Dynamics Transit Connect Electric
|-
| 538 || Zero Motorcycles
|-
| 53G || Coda Automotive
|-
| 53T || Think North America in Elkhart, IN
|-
| 546 || EBR Motorcycles
|-
| 54C || Winnebago Industries travel trailer
|-
| 54D || Isuzu & Chevrolet commercial trucks built by Spartan Motors/The Shyft Group
|-
| 54F || Rosenbauer Motors (incomplete vehicle)
|-
| 55S || Mercedes-Benz car
|-
| 56E || Armor Lite Trailer Mfg. (truck trailers)
|-
| 56K || Indian Motorcycle International, LLC (Polaris subsidiary)
|-
| 573 || Grand Design RV (truck trailer)
|-
| 57C || Maurer Manufacturing (truck trailer)
|-
| 57R || Oreion Motors
|-
| 57S || Lightning Motors Corp. (electric motorcycles)
|-
| 57W || Mobility Ventures
|-
| 57X || Polaris Slingshot
|-
| 58A || Lexus car made by TMMK (Lexus ES)
|-
| 6AB || MAN Australia
|-
| 6AM || Jayco Corp. (RVs)
|-
| 6F1 || Ford
|-
| 6F2 || Iveco Trucks Australia Ltd.
|-
| 6F4 || Nissan Motor Company Australia
|-
| 6F5 || Kenworth Australia
|-
| 6FM || Mack Trucks Australia
|-
| 6FP || [[../Ford/VIN Codes|Ford]] Australia
|-
| 6G1 || [[../GM/VIN Codes|General Motors]]-Holden (post Nov 2002), Chevrolet 2000-2013, Vauxhall Monaro & VXR8 ('08-'17), Daewoo Statesman & Veritas
|-
| 6G2 || [[../GM/VIN Codes|Pontiac]] made in Australia ('04-'06 GTO & '08-'09 G8)
|-
| 6G3 || [[../GM/VIN Codes|General Motors]] Chevrolet Caprice PPV & SS performance sedan 2014-2017, Middle East mkt. Chevrolet Caprice '14-'17
|-
| 6H8 || [[../GM/VIN Codes|General Motors]]-Holden (pre Nov 2002)
|-
| 6KT || BCI Bus
|-
| 6MM || Mitsubishi Motors Australia
|-
| 6MP || Mercury Capri 1991-1994
|-
| 6T1 || [[../Toyota/VIN Codes|Toyota]] Motor Corporation Australia
|-
| 6T9 || Privately Imported car (VIN issued by Victoria) or Trailer in Australia
|-
| 6U9 || Privately Imported car in Australia
|-
| 6Y9/043 || Intertruck Distributors (NZ) Ltd. - International Trucks New Zealand
|-
| 6ZZ || Privately Imported car in Australia
|-
| 7AB || MAN New Zealand
|-
| 7AT || VIN assigned by the New Zealand Transport Authority Waka Kotahi from 29 November 2009
|-
| 7A1 || Mitsubishi New Zealand
|-
| 7A3 || Honda New Zealand
|-
| 7A4 || Toyota New Zealand
|-
| 7A5 || Ford New Zealand
|-
| 7A7 || Nissan New Zealand
|-
| 7A8 || VIN assigned by the New Zealand Transport Authority Waka Kotahi before 29 November 2009
|-
| 7B2 || Nissan Diesel bus New Zealand
|-
| 7FA || Honda SUV made by Honda Manufacturing of Indiana
|-
| 7FC || Rivian truck
|-
| 7F7 || Arcimoto, Inc.
|-
| 7GZ || GMC incomplete vehicles (Savana cutaway) made by Navistar International/International Motors
|-
| 7G0 || Faraday Future
|-
| 7G2 || Tesla, Inc. truck (used for Nevada-built Semi Trucks & Texas-built Cybertruck)
|-
| 7H4 || Hino truck
|-
| 7H8 || Cenntro Electric Group Limited low-speed vehicle
|-
| 7JD || Volvo Cars SUV
|-
| 7JR || Volvo Cars passenger car
|-
| 7JS || White River Marine Group (trailer)
|-
| 7JZ || Proterra From mid-2019 on
|-
| 7KG || Vanderhall Motor Works
|-
| 7KY || Dorsey (truck trailer)
|-
| 7MM || Mazda SUV made by MTMUS (Mazda-Toyota Joint Venture)
|-
| 7MU || Toyota SUV made by MTMUS (Mazda-Toyota Joint Venture)
|-
| 7MW || Cenntro Electric Group Limited truck
|-
| 7MZ || HDK electric vehicles
|-
| 7NA || Navistar Defense/ND Defense
|-
| 7NY || Lordstown Motors
|-
| 7PD || Rivian SUV
|-
| 7RZ || Electric Last Mile Solutions
|-
| 7SA || Tesla, Inc. (US-built MPVs (e.g. Model X, Model Y))
|-
| 7SU || Blue Arc electric trucks made by The Shyft Group
|-
| 7SV || [[../Toyota/VIN Codes|Toyota]] SUV made by TMMTX
|-
| 7SX || Global Electric Motorcars (WAEV) 2022-
|-
| 7SY || Polestar SUV
|-
| 7TN || Canoo
|-
| 7UU || Lucid Motors MPV/SUV
|-
| 7UZ || Kaufman Trailers (trailer)
|-
| 7VV || Ree Automotive
|-
| 7WA || Scout Motors (MPV)
|-
| 7WE || Bollinger Motors incomplete vehicle
|-
| 7XB || Denago EV Corporation (Low-Speed Vehicle)
|-
| 7YA || Hyundai & Kia MPV/SUV made by HMGMA
|-
| 7ZJ || Meyers Manx, LLC (Manx EV Resorter) [Low Speed Vehicle]
|-
| 7Z0 || Zoox
|-
| 71T || Slate Auto (truck)
|-
| 71V || Slate Auto (MPV)
|-
| 722 || Isuzu North America Corp. (incomplete vehicle - medium duty)
|-
| 8AB || Mercedes Benz truck & bus (Argentina)
|-
| 8AC || Mercedes Benz vans (for South America)
|-
| 8AD || Peugeot Argentina
|-
| 8AE || Peugeot van
|-
| 8AF || [[../Ford/VIN Codes|Ford]] Argentina
|-
| 8AG || [[../GM/VIN Codes|Chevrolet]] Argentina
|-
| 8AJ || [[../Toyota/VIN Codes|Toyota]] Argentina
|-
| 8AK || Suzuki Argentina
|-
| 8AN || Nissan Argentina
|-
| 8AP || Fiat Argentina
|-
| 8AT || Iveco Argentina
|-
| 8AW || Volkswagen Argentina
|-
| 8A1 || Renault Argentina
|-
| 8A3 || Scania Argentina
|-
| 8A7 || Minarelli S.A.
|-
| 8BB || Agrale Argentina S.A.
|-
| 8BC || Citroën Argentina
|-
| 8BN || Mercedes-Benz incomplete vehicle (North America)
|-
| 8BR || Mercedes-Benz "bus" (van with more than 3 rows of seats) (North America)
|-
| 8BT || Mercedes-Benz MPV (van with 2 or 3 rows of seats) (North America)
|-
| 8BU || Mercedes-Benz truck (cargo van with 1 row of seats) (North America)
|-
| 8CH || Honda motorcycle
|-
| 8C3 || Honda car/SUV
|-
| 8G1 || Automotores Franco Chilena S.A. Renault
|-
| 8GD || Automotores Franco Chilena S.A. Peugeot
|-
| 8GG || [[../GM/VIN Codes|Chevrolet]] Chile
|-
| 8LD || General Motors OBB - Chevrolet Ecuador
|-
| 8LF || Maresa (Mazda)
|-
| 8LG || Aymesa (Hyundai Motor & Kia)
|-
| 8L4 || Great Wall Motors made by Ciudad del Auto (Ciauto)
|-
| 8XD || Ford Motor Venezuela
|-
| 8XJ || Mack de Venezuela C.A.
|-
| 8XV || Iveco Venezuela C.A.
|-
| 8Z1 || General Motors Venezolana C.A.
|-
| 829 || Industrias Quantum Motors S.A. (Bolivia)
|-
| 9BD || Fiat Brazil & Dodge, Ram made by Fiat Brasil
|-
| 9BF || [[../Ford/VIN Codes|Ford]] Brazil
|-
| 9BG || [[../GM/VIN Codes|Chevrolet]] Brazil
|-
| 9BH || Hyundai Motor Brasil
|-
| 9BM || Mercedes-Benz Brazil car, SUV, commercial truck & bus
|-
| 9BN || Mafersa
|-
| 9BR || [[../Toyota/VIN Codes|Toyota]] Brazil
|-
| 9BS || Scania Brazil
|-
| 9BU ||Gurgel Motores S.A. (defunct Brazilian automaker)
|-
| 9BV || Volvo Trucks Brazil
|-
| 9BW || Volkswagen Brazil
|-
| 9BY || Agrale S.A.
|-
| 9C2 || Moto Honda Da Amazonia Ltda.
|-
| 9C6 || Yamaha Motor Da Amazonia Ltda.
|-
| 9CD || Suzuki (motorcycles) assembled by J. Toledo Motos do Brasil
|-
| 9DF || Puma
|-
| 9DW || Kenworth & Peterbilt trucks [incomplete vehicle] made by Volkswagen do Brasil
|-
| 9EZ || homemade or handbuilt vehicles
|-
| 92H || Origem Brazil
|-
| 932 || Harley-Davidson Brazil
|-
| 935 || Citroën Brazil
|-
| 936 || Peugeot Brazil
|-
| 937 || Dodge Dakota
|-
| 93C || Chevrolet SUV [Tracker] or pickup [Tornado, Montana, S10] (sold in Mexico, made in Brazil)
|-
| 93H || [[../Honda/VIN Codes|Honda]] Brazil car/SUV
|-
| 93K || Volvo Trucks Brazil
|-
| 93P || Volare
|-
| 93S || Navistar International
|-
| 93R || [[../Toyota/VIN Codes|Toyota]] Brazil
|-
| 93U || Audi Brazil 1999–2006
|-
| 93W || Fiat Ducato made by Iveco 2000–2016
|-
| 93V || Navistar International
|-
| 93X || Souza Ramos – Mitsubishi Motors / Suzuki Jimny
|-
| 93Y || Renault Brazil
|-
| 93Z || Iveco
|-
| 94D || Nissan Brazil
|-
| 94N || RWM Brazil
|-
| 94T || Troller Veículos Especiais
|-
| 95P || CAOA Hyundai & CAOA Chery
|-
| 95V || Dafra Motos (motorscooters from SYM) & Ducati, KTM, & MV Agusta assembled by Dafra
|-
| 95V || BMW motorcycles assembled by Dafra Motos 2009–2016
|-
| 95Z || Buell Motorcycle Company assembled by Harley-Davidson Brazil
|-
| 953 || VW Truck & Bus / MAN Truck & Bus
|-
| 96P || Kawasaki
|-
| 97N || Triumph Motorcycles Ltd.
|-
| 988 || Jeep, Ram [Rampage], and Fiat [Toro] (made at the Goiana plant)
|-
| 98M || BMW car/SUV
|-
| 98P || DAF Trucks
|-
| 98R || Chery
|-
| 99A || Audi 2016-
|-
| 99H || Shineray
|-
| 99J || Jaguar Land Rover
|-
| 99K || Haojue & Kymco assembled by JTZ Indústria e Comércio de Motos
|-
| 99L || BYD
|-
| 99Z || BMW Motorrad (Motorcycle assembled by BMW 2017-)
|-
| 9FB || Renault Colombia (Sofasa)
|-
| 9FC || Compañía Colombiana Automotriz S.A. (Mazda)
|-
| 9GA || [[../GM/VIN Codes|Chevrolet]] Colombia (GM Colmotores S.A.)
|-
| 9UJ || Chery assembled by Chery Socma S.A. (Uruguay)
|-
| 9UK || Lifan (Uruguay)
|-
| 9UT || Dongfeng trucks made by Nordex S.A.
|-
| 9UW || Kia made by Nordex S.A.
|-
| 9VC || Fiat made by Nordex S.A. (Scudo, 2025 Titano)
|-
| 9V7 || Citroen made by Nordex S.A. (Jumpy)
|-
| 9V8 || Peugeot made by Nordex S.A. (Expert)
|}
==References==
{{reflist}}
{{BookCat}}
dl9370ys2ndmzg8ld1m7cllz7bhxmtm
4669672
4669641
2026-09-11T11:23:17Z
Greenman
7490
Rejected the last text change (by [[Special:Contributions/~2026-49431-52|~2026-49431-52]]) and restored revision 4669456 by JustTheFacts33
4669672
wikitext
text/x-wiki
==World Manufacturer Identifier==
The first three characters uniquely identify the manufacturer of the vehicle using the '''World Manufacturer Identifier''' or '''WMI''' code. A manufacturer that builds fewer than 1000 vehicles per year uses a 9 as the third digit and the 12th, 13th and 14th position of the VIN for a second part of the identification. Some manufacturers use the third character as a code for a vehicle category (e.g., bus or truck), a division within a manufacturer, or both. For example, within 1G (assigned to General Motors in the United States), 1G1 represents Chevrolet passenger cars; 1G2, Pontiac passenger cars; and 1GC, Chevrolet trucks.
===WMI Regions===
The first character of the WMI is the region in which the manufacturer is located. In practice, each is assigned to a country of manufacture. Common auto-manufacturing countries are noted. <ref>{{cite web
| url=https://standards.iso.org/iso/3780/
| title=ISO Standards Maintenance Portal: ISO 3780
| publisher=[[wikipedia:International Organization for Standardization]]}}</ref>
{| class="wikitable" style="text-align:center"
|-
! WMI
! Region
! Notes
|-
| A-C
| Africa
| AA-AH = South Africa<br />BF-BG = Kenya<br />BU = Uganda<br />CA-CB = Egypt<br />DF-DK = Morocco
|-
| E, H-R
| Asia
| E=Russia<br />H = China<br />J = Japan<br />KF-KH = Israel<br />KL-KR = South Korea<br />L = China<br />MA-ME = India<br />MF-MK = Indonesia<br />ML-MR = Thailand<br />MS = Myanmar<br />MX = Kazakhstan<br />MY-M0 = India<br />NF-NG = Pakistan<br />NL-NR = Turkey<br />NS-NT = Uzbekistan<br />PA-PC = Philippines<br />PF-PG = Singapore<br />PL-PR = Malaysia<br />PS-PT = Bangladesh<br />PV=Cambodia<br />RA-RB = United Arab Emirates<br />RF-RK = Taiwan<br />RL-RN = Vietnam<br />RS-RT = Saudi Arabia<br />RU-RW = Russia<br />R1-R7 = Hong Kong
|-
| S-Z
| Europe
| SA-SM = United Kingdom<br />SN-ST = Germany (formerly East Germany)<br />SU-SZ = Poland<br />TA-TH = Switzerland<br />TJ-TP = Czech Republic<br />TR-TV = Hungary<br />TW-T2 = Portugal<br />UH-UM = Denmark<br />UN-UR = Ireland<br />UU-UX = Romania<br />U1-U2 = North Macedonia<br />U5-U7 = Slovakia<br />VA-VE = Austria<br />VF-VR = France<br />VS-VW = Spain<br />VX-V2 = France (formerly Serbia/Yugoslavia)<br />V3-V5 = Croatia<br />V6-V8 = Estonia<br /> W = Germany (formerly West Germany)<br />XA-XC = Bulgaria<br />XF-XH = Greece<br />XL-XR = The Netherlands<br />XS-XW = Russia (formerly USSR)<br />XX-XY = Luxembourg<br />XZ-X0 = Russia<br />YA-YE = Belgium<br />YF-YK = Finland<br />YS-YW = Sweden<br />YX-Y2 = Norway<br />Y3-Y5 = Belarus<br />Y6-Y8 = Ukraine<br />ZA-ZU = Italy<br />ZX-ZZ = Slovenia<br />Z3-Z5 = Lithuania<br />Z6-Z0 = Russia
|-
| 1-5
| North America
| 1, 4, 5 = United States<br />2 = Canada<br />3 = Mexico<br />7F-70 = United States
|-
| 6-7
| Oceania
| 6A-6W = Australia<br />7A-7E = New Zealand<br />Revised: 6A-6X = Australia<br />6Y-61 = New Zealand
|-
| 8-9
| South America
| 8A-8E = Argentina<br />8F-8G = Chile<br />8L-8N = Ecuador<br />8S-8T = Peru<br />8X-8Z = Venezuela<br />82 = Bolivia<br />84 = Costa Rica<br />9A-9E, 91-90 = Brazil<br />9F-9G = Colombia<br />9S-9V = Uruguay
|}
{| class="wikitable" style="text-align:center"
|-
!
! A
! B
! C
! D
! E
! F
! G
! H
! J
! K
! L
! M
! N
! P
! R
! S
! T
! U
! V
! W
! X
! Y
! Z
! 1
! 2
! 3
! 4
! 5
! 6
! 7
! 8
! 9
! 0
|-
| '''A''' || colspan="8" | South Africa || colspan="2" | Ivory Coast || colspan="2" | Lesotho || colspan="2" | Botswana || colspan="2" | Namibia || colspan="2" | Madagascar || colspan="2" | Mauritius || colspan="2" | Tunisia || colspan="2" | Cyprus || colspan="2" | Zimbabwe || colspan="2" | Mozambique || colspan="5" | ''Africa''
|-
| '''B''' || colspan="2" | Angola || colspan="1" | Ethiopia || colspan="2" | ''Africa'' || colspan="2" | Kenya || colspan="1" | Rwanda || colspan="2" | ''Africa'' || colspan="1" | Nigeria || colspan="3" | ''Africa'' || colspan="1" | Algeria || colspan="1" | ''Africa'' || colspan="1" | Swaziland || colspan="1" | Uganda || colspan="7" | ''Africa''|| colspan="2" | Libya || colspan="6" | ''Africa''
|-
| '''C''' || colspan="2" | Egypt || colspan="3" | ''Africa'' || colspan="2" | Morocco || colspan="3" | ''Africa'' || colspan="2" | Zambia || colspan="21" | ''Africa''
|-
| '''D''' || colspan="33" rowspan="1" |
|-
| '''E''' || colspan="33" | Russia
|-
| '''F''' || colspan="33" rowspan="2" |
|-
| '''G'''
|-
| '''H''' || colspan="33" | China
|-
| '''J''' || colspan="33" | Japan
|-
| '''K''' || colspan="5" | ''Asia'' || colspan="3" | Israel || colspan="2" | ''Asia'' || colspan="5" | South Korea || colspan="2" | Jordan || colspan="6" | ''Asia'' || colspan="3" | South Korea || colspan="1" | ''Asia'' || colspan="1" | Kyrgyzstan || colspan="5" | ''Asia''
|-
| '''L''' || colspan="33" | China
|-
| '''M''' || colspan="5" | India || colspan="5" | Indonesia || colspan="5" | Thailand || colspan="1" | Myanmar || colspan="1" | ''Asia'' || colspan="1" | Mongolia || colspan="2" | ''Asia'' || colspan="1" | Kazakhstan || colspan="12" | India
|-
| '''N''' || colspan="5" | Iran || colspan="2" | Pakistan || colspan="1" | ''Asia'' || colspan="1" | Iraq || colspan="1" | ''Asia'' || colspan="5" | Turkey || colspan="2" | Uzbekistan || colspan="1" | ''Asia'' || colspan="1" | Azerbaijan || colspan="1" | ''Asia'' || colspan="1" | Tajikistan || colspan="1" | Armenia || colspan="1" | ''Asia'' || colspan="5" | Iran || colspan="1" | ''Asia'' || colspan="2" | Turkey || colspan="2" | ''Asia''
|-
| '''P''' || colspan="3" | Philippines || colspan="2" | ''Asia'' || colspan="2" | Singapore || colspan="3" | ''Asia'' || colspan="5" | Malaysia || colspan="2" | Bangladesh || colspan="10" | ''Asia'' || colspan="6" | India
|-
| '''R''' || colspan="2" | UAE || colspan="3" | ''Asia'' || colspan="5" | Taiwan || colspan="3" | Vietnam || colspan="1" | Laos || colspan="1" | ''Asia'' || colspan="2" | Saudi Arabia || colspan="3" | Russia || colspan="3" | ''Asia'' || colspan="7" | Hong Kong || colspan="3" | ''Asia''
|-
!
! A
! B
! C
! D
! E
! F
! G
! H
! J
! K
! L
! M
! N
! P
! R
! S
! T
! U
! V
! W
! X
! Y
! Z
! 1
! 2
! 3
! 4
! 5
! 6
! 7
! 8
! 9
! 0
|-
| '''S''' || colspan="12" | United Kingdom || colspan="5" | Germany <small>(formerly East Germany)</small> || colspan="6" | Poland || colspan="2" | Latvia || colspan="1" | Georgia || colspan="1" | Iceland || colspan="6" | ''Europe''
|-
| '''T''' || colspan="8" | Switzerland || colspan="6" | Czech Republic || colspan="5" | Hungary || colspan="6" | Portugal || colspan="3" | Serbia || colspan="1" | Andorra || colspan="2" | Netherlands || colspan="2" | ''Europe''
|-
| '''U''' || colspan="3" | Spain || colspan="4" | ''Europe'' || colspan="5" | Denmark || colspan="3" | Ireland || colspan="2" | ''Europe'' || colspan="4" | Romania || colspan="2" | ''Europe'' || colspan="2" | North Macedonia || colspan="2" | ''Europe'' || colspan="3" | Slovakia || colspan="3" | Bosnia & Herzogovina
|-
| '''V''' || colspan="5" | Austria || colspan="10" | France || colspan="5" | Spain || colspan="5" | France <small>(formerly Yugoslavia & Serbia)</small> || colspan="3" | Croatia || colspan="3" | Estonia || colspan="2" | ''Europe''
|-
| '''W''' || colspan="33" | Germany
|-
| '''X''' || colspan="3" | Bulgaria || colspan="2" | Russia || colspan="3" | Greece || colspan="2" | Russia || colspan="5" | Netherlands || colspan="5" | Russia <small>(formerly USSR)</small> || colspan="2" | Luxembourg || colspan="11" | Russia
|-
| '''Y''' || colspan="5" | Belgium || colspan="5" | Finland || colspan="2" | ''Europe'' || colspan="1" | Malta || colspan="2" | ''Europe'' || colspan="5" | Sweden || colspan="5" | Norway || colspan="3" | Belarus || colspan="3" | Ukraine || colspan="2" | ''Europe''
|-
| '''Z''' || colspan="18" | Italy || colspan="2" | ''Europe'' || colspan="3" | Slovenia || colspan="1" | San Marino|| colspan="1" | ''Europe''|| colspan="3" | Lithuania || colspan="5" | Russia
|-
| '''1''' || colspan="33" | United States
|-
| '''2''' || colspan="28" | Canada || colspan="5" | ''North America''
|-
| '''3''' || colspan="21" | Mexico || colspan="5" | ''North America'' || colspan="1" | Nicaragua || colspan="1" | Dom. Rep. || colspan="1" | Honduras || colspan="1" | Panama || colspan="2" | Puerto Rico || colspan="1" | ''North America''
|-
| '''4''' || colspan="33" rowspan="2" | United States
|-
| '''5'''
|-
| '''6''' || colspan="21" | Australia || colspan="3" | New Zealand || colspan="9" | ''Oceania''
|-
| '''7''' || colspan="5" | New Zealand || colspan="28" | United States
|-
| '''8''' || colspan="5" | Argentina || colspan=2 | Chile || colspan="3" | ''South America'' || colspan="3" | Ecuador || colspan="2" | ''South America'' || colspan="2" | Peru || colspan="3" | ''South America'' || colspan="3" | Venezuela || colspan="1" | ''SA'' || colspan="1" | Bolivia || colspan="1" | ''SA'' || colspan="1" | Costa Rica || colspan="6" | ''South America''
|-
| '''9''' || colspan="5" | Brazil || colspan="2" | Colombia || colspan="8" | ''South America'' || colspan="4" | Uruguay || colspan="4" | ''South America'' || colspan="10" | Brazil
|-
| '''0''' || colspan="33" rowspan="1" |
|}
===List of Many WMIs===
The [[w:Society of Automotive Engineers|Society of Automotive Engineers]] (SAE) in the US assigns WMIs to countries and manufacturers.<ref>{{cite web
| url=https://www.iso.org/standard/45844.html
| title=ISO 3780:2009 - Road vehicles — World manufacturer identifier (WMI) code
| date=October 2009
| publisher=International Organization for Standardization}}</ref> The following table contains a list of mainly commonly used WMIs, although there are many others assigned.
{| class="wikitable x" style="text-align:center"
|-
! WMI !! Manufacturer
|-
| AAA|| Audi South Africa made by Volkswagen of South Africa
|-
| AAK|| FAW Vehicle Manufacturers SA (PTY) Ltd.
|-
| AAM|| MAN Automotive (South Africa) (Pty) Ltd. (includes VW Truck & Bus)
|-
|AAP || VIN restamped by South African Police Service (so-called SAPVIN or AAPV number)
|-
| AAV || Volkswagen South Africa
|-
| AAW || Challenger Trailer Pty Ltd. (South Africa)
|-
| AA9/CN1 || TR-Tec Pty Ltd. (South Africa)
|-
| ABJ || Mitsubishi Colt & Triton pickups made by Mercedes-Benz South Africa 1994–2011
|-
| ABJ || Mitsubishi Fuso made by Daimler Trucks & Buses Southern Africa
|-
| ABM || BMW Southern Africa
|-
| ACV || Isuzu Motors South Africa 2018-
|-
| AC5 || [[../Hyundai/VIN Codes|Hyundai]] Automotive South Africa
|-
| AC9/BM1 || Beamish Beach Buggies (South Africa)
|-
| ADB || Mercedes-Benz South Africa car
|-
| ADD || UD Trucks Southern Africa (Pty) Ltd.
|-
| ADM || General Motors South Africa (includes Isuzu through 2018)
|-
| ADN || Nissan South Africa (Pty) Ltd.
|-
| ADR || Renault Sandero made by Nissan South Africa (Pty) Ltd.
|-
| ADX || Tata Automobile Corporation (SA) Ltd.
|-
| AE9/MT1 || Backdraft Racing (South Africa)
|-
| AFA || Ford Motor Company of Southern Africa & Samcor
|-
| AFB || Mazda BT-50 made by Ford Motor Company of Southern Africa
|-
| AFD || BAIC Automotive South Africa
|-
| AFZ || Fiat Auto South Africa
|-
| AHH || Hino South Africa
|-
| AHM || Honda Ballade made by Mercedes-Benz South Africa 1982–2000
|-
| AHT || Toyota South Africa Motors (Pty.) Ltd.
|-
| BF9/|| KIBO Motorcycles, Kenya
|-
| BUK || Kiira Motors Corporation, Uganda
|-
| BR1 || Mercedes-Benz Algeria (SAFAV MB)
|-
| BRY || FIAT Algeria
|-
| CA3 || MCV bus (Egypt)
|-
| DDY || Geyushi Motors (bus) (Egypt)
|-
| DF9/|| Laraki (Morocco)
|-
| EAA || Aurus Motors (Russia)
|-
| EAN || Evolute (Russia)
|-
| EAU || Elektromobili Manufacturing Rus - EVM (Russia)
|-
| EBE || Sollers-Auto (Russia)
|-
| EBZ || Nizhekotrans bus (Russia)
|-
| ECE || XCITE (Russia)
|-
| ECW || Trans-Alfa bus (Russia)
|-
| EDE || Tenet (Russia)
|-
| HAC || GAC Motor (Aion)
|-
| HA0 || Wuxi Sundiro Electric Vehicle Co., Ltd. (Palla, Parray)
|-
| HA6 || Jiangsu Niu Electric Technology Co., Ltd. (Niu)
|-
| HA7 || Jinan Qingqi KR Motors Co., Ltd.
|-
| HES || smart Automobile Co., Ltd. (Mercedes-Geely joint venture)
|-
| HGL || Farizon Auto van (Geely)
|-
| HGX || Wuling Motors commercial vehicle (Geely)
|-
| HHZ || Huazi Automobile
|-
| HJN || Nio, Firefly
|-
| HJR || Chery Commercial Vehicle (Anhui) Co., Ltd. Jetour made by Chery Commercial Vehicle
|-
| HJZ || Juzhen Chengshi van
|-
| HJ4 || BAW car
|-
| HLX || Li Auto
|-
| HL4 || Zhejiang Morini Vehicle Co., Ltd. <br />(Moto Morini subsidiary of Taizhou Zhongneng Motorcycle Co., Ltd.)
|-
| HRV || Beijing Henrey Automobile Technology Co., Ltd.
|-
| HT5 || Zhejiang Jianying Locomotive Co., Ltd. (motorcycle)
|-
| HVW || Volkswagen Anhui
|-
| HWM || WM Motor Technology Co., Ltd. (Weltmeister)
|-
| HXM || Xiaomi
|-
| HZ2 || Taizhou Zhilong Technology Co., Ltd (motorcycle)
|-
| H0D || Taizhou Qianxin Vehicle Co., Ltd. (motorcycle)
|-
| H0G || Wisdom (Fujian) Motor Co., Ltd. (bus)
|-
| JAA || Isuzu truck, Holden Rodeo TF, Opel Campo, Bedford/Vauxhall Brava pickup made by Isuzu in Japan
|-
| JAB || Isuzu car
|-
| JAC || Isuzu SUV, Opel/Vauxhall Monterey & Holden Jackaroo/Monterey made by Isuzu in Japan
|-
| JAE || Acura SLX made by Isuzu
|-
| JAL || Isuzu commercial trucks & <br /> Chevrolet commercial trucks made by Isuzu 2016+ & <br /> Hino S-series truck made by Isuzu (Incomplete Vehicle - medium duty)
|-
| JAM || Isuzu commercial trucks (Incomplete Vehicle - light duty)
|-
| JA3 || Mitsubishi car (for North America)
|-
| JA4 || Mitsubishi MPV/SUV (for North America) & Nissan Rogue PHEV '26 made by Mitsubishi
|-
| JA7 || Mitsubishi truck (for North America)
|-
| JB3 || Dodge car made by Mitsubishi Motors
|-
| JB4 || Dodge MPV/SUV made by Mitsubishi Motors
|-
| JB7 || Dodge truck made by Mitsubishi Motors
|-
| JC0 || Ford brand cars made by Mazda
|-
| JC1 || Fiat 124 Spider made by Mazda
|-
| JC2 || Ford Courier made by Mazda
|-
| JDA || Daihatsu, Subaru Justy made by Daihatsu
|-
| JD1 || Daihatsu car
|-
| JD2 || Daihatsu SUV
|-
| JD4 || Daihatsu truck
|-
| JE3 || Eagle car made by Mitsubishi Motors
|-
| JE4 || Mitsubishi Motors
|-
| JF1 || [[../Subaru/VIN Codes|Subaru]] car & Scion FR-S/Toyota 86/Toyota GR86 made by Subaru
|-
| JF2 || [[../Subaru/VIN Codes|Subaru]] SUV
|-
| JF3 || [[../Subaru/VIN Codes|Subaru]] truck
|-
| JF4 || Saab 9-2X made by Subaru
|-
| JG1 || Chevrolet/Geo car made by Suzuki
|-
| JG2 || Pontiac car made by Suzuki
|-
| JG7 || Pontiac/Asuna car made by Suzuki for GM Canada
|-
| JGC || Chevrolet/Geo SUV made by Suzuki (classified as a truck)
|-
| JGT || GMC SUV made by Suzuki for GM Canada (classified as a truck)
|-
| JHA || Hino truck
|-
| JHB || Hino incomplete vehicle
|-
| JHD || Hino
|-
| JHF || Hino
|-
| JHH || Hino incomplete vehicle
|-
| JHF-JHG, JHL-JHN, JHZ,<br/>JH1-JH5 || [[../Honda/VIN Codes|Honda]]
|-
| JHL || [[../Honda/VIN Codes|Honda]] MPV/SUV
|-
| JHM || [[../Honda/VIN Codes|Honda]] car
|-
| JH1 || [[../Honda/VIN Codes|Honda]] truck
|-
| JH2 || [[../Honda/VIN Codes|Honda]] motorcycle/ATV
|-
| JH3 || [[../Honda/VIN Codes|Honda]] ATV
|-
| JH4 || Acura car
|-
| JH6 || Hino incomplete vehicle
|-
| JJ3 || Chrysler brand car made by Mitsubishi Motors
|-
| JKA || Kawasaki (motorcycles)
|-
| JKB || Kawasaki (motorcycles)
|-
| JKM || Mitsuoka
|-
| JKS || Suzuki Marauder 1600/Boulevard M95 motorcycle made by Kawasaki
|-
| JK8 || Suzuki QUV620F UTV made by Kawasaki
|-
| JLB || Mitsubishi Fuso Truck & Bus Corp.
|-
| JLF || Mitsubishi Fuso Truck & Bus Corp.
|-
| JLS || Sterling Truck 360 made by Mitsubishi Fuso Truck & Bus Corp.
|-
| JL5 || Mitsubishi Fuso Truck & Bus Corp.
|-
| JL6 || Mitsubishi Fuso Truck & Bus Corp.
|-
| JL7 || Mitsubishi Fuso Truck & Bus Corp.
|-
| JMA || Mitsubishi Motors (right-hand drive) for Europe
|-
| JMB || Mitsubishi Motors (left-hand drive) for Europe
|-
| JMF || Mitsubishi Motors for Australia (including Mitsubishi Express made by Renault)
|-
| JMP || Mitsubishi Motors (left-hand drive)
|-
| JMR || Mitsubishi Motors (right-hand drive)
|-
| JMY || Mitsubishi Motors (left-hand drive) for South America & Middle East
|-
| JMZ || Mazda for Europe export & Mazda 2 made by Ford Spain & Mazda 2 Hybrid made by Toyota Motor Manufacturing France
|-
| JM0 || Mazda for Oceania export
|-
| JM1 || Mazda car
|-
| JM2 || Mazda truck
|-
| JM3 || Mazda MPV/SUV
|-
| JM4 || Mazda
|-
| JM6 || Mazda
|-
| JM7 || Mazda
|-
| JNA || Nissan Diesel/UD Trucks (incomplete vehicle)
|-
| JNC || Nissan Diesel/UD Trucks
|-
| JNE || Nissan Diesel/UD Trucks (truck)
|-
| JNK || Infiniti car
|-
| JNR || Infiniti SUV
|-
| JNX || Infiniti incomplete vehicle
|-
| JN1 || Nissan car & Infiniti car
|-
| JN3 || Nissan incomplete vehicle
|-
| JN6 || Nissan truck/van & Mitsubishi Fuso Canter Van
|-
| JN8 || Nissan MPV/SUV & Infiniti SUV
|-
| JPA || International Trucks made by Nissan Diesel (incomplete vehicle)
|-
| JPB || International Trucks made by Nissan Diesel (tractor truck)
|-
| JPC || Nissan Diesel/UD Trucks
|-
| JPE || International Trucks made by Nissan Diesel (truck)
|-
| JP3 || Plymouth car made by Mitsubishi Motors
|-
| JP4 || Plymouth MPV/SUV made by Mitsubishi Motors
|-
| JP7 || Plymouth truck made by Mitsubishi Motors
|-
| JR2 || Isuzu Oasis made by Honda
|-
| JSA || Suzuki ATV & '03 Kawasaki KFX400 ATV made by Suzuki, Suzuki car/SUV (outside N. America), Holden Cruze YG made by Suzuki
|-
| JSK || Kawasaki KLX125/KLX125L motorcycle made by Suzuki
|-
| JSL || '04-'06 Kawasaki KFX400 ATV made by Suzuki
|-
| JST || Suzuki Across SUV made by Toyota
|-
| JS1 || Suzuki motorcycle & Kawasaki KLX400S/KLX400SR motorcycle made by Suzuki
|-
| JS2 || Suzuki car
|-
| JS3 || Suzuki SUV
|-
| JS4 || Suzuki truck
|-
| JTB || Toyota bus
|-
| JTD || Toyota car
|-
| JTE || Toyota MPV/SUV
|-
| JTF || Toyota van/truck
|-
| JTG || Toyota MPV/bus
|-
| JTH || Lexus car
|-
| JTJ || Lexus SUV
|-
| JTK || Toyota car
|-
| JTL || Toyota SUV
|-
| JTM || Toyota SUV, Subaru Uncharted, Solterra, and Trailseeker made by Toyota
|-
| JTN || Toyota car
|-
| JTP || Toyota SUV
|-
| JT1 || [[../Toyota/VIN Codes|Toyota]] van
|-
| JT2 || Toyota car
|-
| JT3 || Toyota MPV/SUV
|-
| JT4 || Toyota truck/van
|-
| JT5 || Toyota incomplete vehicle
|-
| JT6 || Lexus SUV
|-
| JT7 || Toyota bus/van
|-
| JT8 || Lexus car
|-
| JW6 || Mitsubishi Fuso division of Mitsubishi Motors (through mid-2003)
|-
| JYA || Yamaha motorcycles
|-
| JYE || Yamaha snowmobile
|-
| JY3 || Yamaha 3-wheel ATV
|-
| JY4 || Yamaha 4-wheel ATV
|-
| J81 || Chevrolet/Geo car made by Isuzu
|-
| J87 || Pontiac/Asüna car made by Isuzu for GM Canada
|-
| J8B || Chevrolet commercial trucks made by Isuzu (incomplete vehicle - medium duty)
|-
| J8C || Chevrolet commercial trucks made by Isuzu (truck)
|-
| J8D || GMC commercial trucks made by Isuzu (incomplete vehicle - medium duty)
|-
| J8T || GMC commercial trucks made by Isuzu (truck)
|-
| J8Z || Chevrolet LUV pickup truck made by Isuzu (truck)
|-
| KF3 || Merkavim (Israel)
|-
| KF6 || Automotive Industries, Ltd. (Israel)
|-
| KF9/004 || Tomcar (Israel)
|-
| KG9/002 || Charash Ashdod (truck trailer) (Israel)
|-
| KG9/004 || H. Klein (truck trailer) (Israel)
|-
| KG9/007 || Agam Trailers (truck trailer) (Israel)
|-
| KG9/009 || Merkavey Noa (trailer) (Israel)
|-
| KG9/010 || Weingold Trailers (trailer) (Israel)
|-
| KG9/011 || Netzer Sereni (truck trailer) (Israel)
|-
| KG9/015 || Merkaz Hagrorim (trailer) (Israel)
|-
| KG9/035 || BEL Technologies (truck trailer) (Israel)
|-
| KG9/091 || Jansteel (truck trailer) (Israel)
|-
| KG9/101 || Bassamco (truck trailer) (Israel)
|-
| KG9/104 || Global Handasa (truck trailer) (Israel)
|-
| KL || Daewoo [[../GM/VIN Codes|General Motors]] South Korea
|-
| KLA || Daewoo/GM Daewoo/GM Korea (Chevrolet/Alpheon)<br /> from Bupyeong & Kunsan plants
|-
| KLP || CT&T United (battery electric low-speed vehicles)
|-
| KLT || Tata Daewoo
|-
| KLU || Tata Daewoo
|-
| KLY || Daewoo/GM Daewoo/GM Korea (Chevrolet) from Changwon plant (Tico/Matiz/Matiz Creative/Spark/Damas/Labo)
|-
| KL1 || GM Daewoo/GM Korea (Chevrolet car)
|-
| KL2 || Daewoo/GM Daewoo (Pontiac car)
|-
| KL3 || GM Daewoo/GM Korea (Holden)
|-
| KL4 || GM Korea (Buick MPV/SUV)
|-
| KL5 || GM Daewoo (Suzuki car) US: 2004-2008, Canada: 2004-2011
|-
| KL5 || Daewoo Bus Corp./Zyle Daewoo Bus 2004-2017
|-
| KL6 || GM Daewoo (GMC MPV/SUV)
|-
| KL7 || Daewoo (GM Canada brands: Passport car, Asuna car (Pre-2000))
|-
| KL7 || GM Daewoo/GM Korea (Chevrolet MPV/SUV (Post-2000))
|-
| KL8 || GM Daewoo/GM Korea (Chevrolet car from Changwon plant (Spark))
|-
| KM || [[../Hyundai/VIN Codes|Hyundai]]
|-
| KMC || Hyundai commercial truck
|-
| KME || Hyundai commercial truck (semi-tractor)
|-
| KMF || Hyundai van & commercial truck & Bering Truck
|-
| KMH || Hyundai car & Mitsubishi Precis ('87 - 3/10/88) & Mexican market Dodges made by Hyundai
|-
| KMJ || Hyundai minibus/bus
|-
| KMT || Genesis Motor car
|-
| KMU || Genesis Motor SUV
|-
| KMX || Hyundai Galloper SUV
|-
| KMY || Daelim Motor Company, Ltd/DNA Motors Co., Ltd. (motorcycles)
|-
| KM1 || Hyosung Motors (motorcycles)
|-
| KM4 || Hyosung Motors/S&T Motors/KR Motors (motorcycles)
|-
| KM8 || Hyundai SUV
|-
| KNA || Kia car
|-
| KNC || Kia truck
|-
| KND || Kia MPV/SUV & Hyundai Entourage
|-
| KNE || Kia for Europe export
|-
| KNF || Kia, special vehicles
|-
| KNG || Kia minibus/bus
|-
| KNJ || Ford Festiva & Aspire made by Kia
|-
| KNL || Kia Elan/Vigato made by Kia Motech
|-
| KNM || Renault Samsung Motors, Nissan Rogue made by Renault Samsung, Nissan Sunny made by Renault Samsung
|-
| KNM || Renault Korea Co., Ltd.
|-
| KN1 || Asia Motors
|-
| KN2 || Asia Motors
|-
| KPA || SsangYong/KG Mobility (KGM) pickup
|-
| KPB || SsangYong car or For S. Korea domestic market: SsangYong/KG Mobility (KGM) SUV/MPV
|-
| KPD || SsangYong bus (TransStar, Istana minibus, Rodius/Korando Turismo 11-seater)
|-
| KPH || Mitsubishi Precis (3/11/88 - '94)
|-
| KPT || SsangYong/KG Mobility (KGM) SUV/MPV (For export)
|-
| LAA || Shanghai Jialing Vehicle Co., Ltd. (motorcycle)
|-
| LAE || Jinan Qingqi Motorcycle
|-
| LAL || Sundiro [[../Honda/VIN Codes|Honda]] Motorcycle
|-
| LAN || Changzhou Yamasaki Motorcycle
|-
| LAP || Chongqing Jianshe Motorcycle Co., Ltd.
|-
| LAP || Zhuzhou Nanfang Motorcycle Co., Ltd.
|-
| LAT || Luoyang Northern Ek Chor Motorcycle Co., Ltd. (Dayang)
|-
| LA6 || Xiamen King Long United Automotive Industry Co., Ltd. (bus)
|-
| LA7 || Radar Auto, Farizon Auto (Geely)
|-
| LA8 || Anhui Ankai
|-
| LA9/AYS || Jiangsu Alfa Bus Co., Ltd. (bus)
|-
| LA9/BFC || Beijing North Huade Neoplan Bus Co., Ltd.
|-
| LA9/FBC || Xiamen Fengtai Bus & Coach International Co., Ltd. (FTBCI) (bus)
|-
| LA9/HFF || Anhui Huaxia Vehicle Manufacturing Co., Ltd. (bus)
|-
| LA9/JXK || CHTC Bonluck Bus Co., Ltd.
|-
| LA9/LC0 || BYD
|-
| LA9/LFJ || Xinlongma Automobile
|-
| LA9/LM6 || SRM Shineray
|-
| LBB || Zhejiang Qianjiang Motorcycle (QJ Motor/Keeway/Benelli)
|-
| LBE || Beijing [[../Hyundai/VIN Codes|Hyundai]] (Hyundai, Shouwang)
|-
| LBM || Zongshen Piaggio
|-
| LBP || Chongqing Jianshe Yamaha Motor Co. Ltd. (motorcycles)
|-
| LBV || BMW Brilliance (BMW, Zinoro)
|-
| LBX || Jiangsu Kinroad Xintian Motorcycle Manufacture Co. Ltd. (motorcycles)
|-
| LBZ || Yantai Shuchi Vehicle Co., Ltd. (bus)
|-
| LB1 || Fujian Benz
|-
| LB2 || Geely Motorcycles
|-
| LB3 || Zhejiang Geely Holding Group (Geely, Galaxy, Geometry, Kandi)
|-
| LB4 || Chongqing Yinxiang Motorcycle Group Co., Ltd.
|-
| LB5 || Foshan City Fosti Motorcycle Co., Ltd.
|-
| LB7 || Tibet New Summit Motorcycle Co., Ltd.
|-
| LCE || Hangzhou Chunfeng Motorcycles (CFMOTO)
|-
| LCR || Gonow
|-
| LC0 || BYD Auto (BYD, Denza)
|-
| LC2 || Changzhou Kwang Yang Motor Co., Ltd. (Kymco)
|-
| LC6 || Changzhou Haojue Suzuki Motorcycle Co. Ltd.
|-
| LDB || Dadi Auto
|-
| LDC || Dongfeng Peugeot Citroen Automobile Co., Ltd. (DPCA), Dongfeng Fengshen (Aeolus) L60
|-
| LDD || Dandong Huanghai Automobile
|-
| LDF || Dezhou Fulu Vehicle Co., Ltd. (motorcycles), BAW Yuanbao electric car (Ace P1 in Norway)
|-
| LDK || FAW Bus (Dalian) Co., Ltd.
|-
| LDN || Soueast (South East (Fujian) Motor Co., Ltd.) including Mitsubishi made by Soueast
|-
| LDP || Dongfeng, Dongfeng Fengshen (Aeolus), Voyah, Renault City K-ZE/Venucia e30 made by eGT New Energy Automotive
|-
| LDY || Zhongtong Bus Holding Co. Ltd.
|-
| LD3 || Guangdong Tayo Motorcycle Technology Co. (Zontes) (motorcycle)
|-
| LD5 || Benzhou Vehicle Industry Group Ltd. (motorcycle)
|-
| LD9/L3A || SiTech (FAW)
|-
| LEC || Tianjin Qingyuan Electric Vehicle Co., Ltd.
|-
| LEF || Jiangling Motors Corporation Ltd. (JMC)
|-
| LEH || Zhejiang Riya Motorcycle Co. Ltd.
|-
| LET || Jiangling-Isuzu Motors, China
|-
| LEW || Dongfeng commercial vehicle
|-
| LE4 || Beijing Benz & Beijing Benz-Daimler Chrysler Automotive Co. (Chrysler, Jeep, Mitsubishi, Mercedes-Benz) & Beijing Jeep Corp.
|-
| LE8 || Guangzhou Huaye Electric Vehicle Technology Co., Ltd. (Formerly Guangzhou Panyu Huanan Motors Group Co., Ltd.) (motorcycles)
|-
| LFB || FAW Group (Bestune, Hongqi) & Mazda made under license by FAW (Mazda 8, CX-7)
|-
| LFF || Zhejiang Taizhou Wangye Power Co., Ltd.
|-
| LFG || Taizhou Chuanl Motorcycle Manufacturing
|-
| LFJ || Fujian Motors Group (Keyton)
|-
| LFM || FAW Toyota Motor (Toyota, Ranz)
|-
| LFN || FAW Bus (Wuxi) Co., Ltd. (truck, bus)
|-
| LFP || FAW Car, Bestune, Hongqi (passenger vehicles) & Mazda made under license by FAW (Mazda 6, CX-4)
|-
| LFT || FAW (trailers)
|-
| LFU || Lifeng Group Co., Ltd. (motorcycles)
|-
| LFV || FAW-Volkswagen (VW, Audi, Jetta, Kaili)
|-
| LFW || FAW JieFang (truck)
|-
| LFX || Sany Heavy Industry (truck)
|-
| LFY || Changshu Light Motorcycle Factory
|-
| LFZ || Leapmotor
|-
| LF3 || Lifan Motorcycle
|-
| LGA || Dongfeng Commercial Vehicle Co., Ltd. trucks
|-
| LGB || Dongfeng Nissan (Nissan, Infiniti, Venucia)
|-
| LGB || Dongfeng Commercial Vehicle Co., Ltd.
|-
| LGC || Dongfeng Commercial Vehicle Co., Ltd. bus chassis
|-
| LGD || Dongfeng Commercial Vehicle Co., Ltd.
|-
| LGF || Dongfeng Commercial Vehicle Co., Ltd. bus chassis
|-
| LGG || Dongfeng Liuzhou Motor (Forthing/Fengxing)
|-
| LGJ || Dongfeng Fengshen (Aeolus)
|-
| LGL || Guilin Daewoo
|-
| LGV || Heshan Guoji Nanlian Motorcycle Industry Co., Ltd.
|-
| LGW || Great Wall Motor (GWM, Haval, Ora, Tank, Wey)
|-
| LGX || BYD Auto (BYD, Fangchengbao)
|-
| LGZ || Guangzhou Denway Bus
|-
| LG6 || Dayun Group
|-
| LHA || Shuanghuan Auto
|-
| LHB || Beijing Automotive Industry Holding
|-
| LHG || GAC Honda (Honda, Everus, Acura)
|-
| LHJ || Chongqing Astronautic Bashan Motorcycle Manufacturing Co., Ltd.
|-
| LHM || Dongfeng Renault Automobile Co.
|-
| LHW || CRRC Electric Vehicle Co., Ltd. (bus)
|-
| LH0 || WM Motor Technology Co., Ltd. (Weltmeister)
|-
| LH1 || FAW-Haima, China
|-
| LJC || Jincheng Corporation
|-
| LJD || Yueda Kia (previously Dongfeng Yueda Kia) (Kia, Horki) & Human Horizons - HiPhi (made under contract by Yueda Kia)
|-
| LJM || Sunlong (bus)
|-
| LJN || Zhengzhou Nissan
|-
| LJR || CIMC Vehicles Group (truck trailer)
|-
| LJS || Yaxing Coach, Asiastar Bus
|-
| LJU || Shanghai Maple Automobile & Kandi & Zhidou
|-
| LJU || Lotus Technology (Wuhan Lotus Cars Co., Ltd.)
|-
| LJV || Sinotruk Chengdu Wangpai Commercial Vehicle Co., Ltd.
|-
| LJW || JMC Landwind
|-
| LJX || JMC Ford
|-
| LJ1 || JAC (JAC, Sehol)
|-
| LJ1 || Nio, Inc.
|-
| LJ4 || Shanghai Jmstar Motorcycle Co., Ltd.
|-
| LJ5 || Cixi Kingring Motorcycle Co., Ltd. (Jinlun)
|-
| LJ8 || Zotye Auto made by Jiangnan Automobile
|-
| LKC || BAIC commercial vehicles, previously Changhe
|-
| LKG || Youngman Lotus Automobile Co., Ltd.
|-
| LKH || Hafei Motor
|-
| LKL || Higer Bus
|-
| LKT || Yunnan Lifan Junma Vehicle Co., Ltd. commercial vehicles
|-
| LK2 || Anhui JAC Bus
|-
| LK6 || SAIC-GM-Wuling (Wuling, Baojun) microcars and other vehicles
|-
| LK8 || Zhejiang Yule New Energy Automobile Technology Co., Ltd. (ATV)
|-
| LLC || Loncin Motor Co., Ltd. (motorcycle)
|-
| LLJ || Jiangsu Xinling Motorcycle Fabricate Co., Ltd.
|-
| LLN || Qoros
|-
| LLP || Zhejiang Jiajue Motorcycle Manufacturing Co., Ltd.
|-
| LLU || Dongfeng Fengxing Jingyi
|-
| LLV || Lifan, Maple (owned by Geely), Livan Automotive
|-
| LLX || Yudo Auto
|-
| LL0 || Sanmen County Yongfu Machine Co., Ltd. (motorcycles)
|-
| LL2 || WM Motor Technology Co., Ltd. (Weltmeister)
|-
| LL3 || Xiamen Golden Dragon Bus Co. Ltd.
|-
| LL6 || GAC Mitsubishi Motors Co., Ltd. (formerly Hunan Changfeng)
|-
| LL8 || Jiangsu Linhai Yamaha Motor Co., Ltd.
|-
| LMC || Suzuki Hong Kong (motorcycles)
|-
| LME || Skyworth (formerly Skywell), Elaris Beo
|-
| LMF || Jiangmen Zhongyu Motor Co., Ltd.
|-
| LMG || GAC Motor, Trumpchi, [[w:Dodge Attitude#Fourth generation (2025)|Dodge Attitude made by GAC]]
|-
| LMH || Jiangsu Guowei Motor Co., Ltd. (Motoleader)
|-
| LMP || Farizon Auto (Geely Sichuan Commercial Vehicle Co., Ltd.)
|-
| LMV || Haima Car Co., Ltd.
|-
| LMV || XPeng Motors G3 (not G3i) made by Haima
|-
| LMW || GAC Group, [[w:Trumpchi GS5#Dodge Journey|Dodge Journey made by GAC]]
|-
| LMX || Forthing (Dongfeng Fengxing)
|-
| LM0 || Wangye Holdings Co., Ltd. (motorcycles)
|-
| LM6 || SWM (automobiles)
|-
| LM8 || Seres (formerly SF Motors), AITO
|-
| LNA || GAC Aion New Energy Automobile Co., Ltd., Hycan
|-
| LNB || BAIC Motor (Senova, Weiwang, Huansu) & Arcfox & Xiaomi SU7 built by BAIC
|-
| LND || JMEV (Jiangxi Jiangling Group New Energy Vehicle Co., Ltd.), Eveasy/Mobilize Limo
|-
| LNE || Zhejiang CRRC Electric Vehicle Co., Ltd. (bus)
|-
| LNP || NAC MG UK Limited & Nanjing Fiat Automobile
|-
| LNN || Chery Automobile, Omoda, Jaecoo
|-
| LNV || Naveco (Nanjing Iveco Automobile Co. Ltd.)
|-
| LNX || Dongfeng Liuzhou Motor (Chenglong trucks)
|-
| LNY || Yuejin
|-
| LPA || Changan PSA (DS Automobiles)
|-
| LPE || BYD Auto
|-
| LPS || Polestar
|-
| LP6 || Guangzhou Panyu Haojian Motorcycle Industry Co., Ltd.
|-
| LRB || SAIC-General Motors (Buick for export)
|-
| LRD || Beijing Foton Daimler Automotive Co., Ltd. Auman trucks
|-
| LRE || SAIC-General Motors (Cadillac for export)
|-
| LRP || Chongqing Rato Power Co. Ltd. (Asus)
|-
| LRR || Ningbo Longjia Power Technology Co., Ltd. (motorcycles)
|-
| LRW || Tesla, Inc. (Gigafactory Shanghai)
|-
| LR4 || Yadi Technology Group
|-
| LR6 || Guangzhou Dayun Vehicle Co., Ltd.
|-
| LSC || Changan Automobile (light truck)
|-
| LSF || SAIC Maxus or LDV pickup/SUV & Chevrolet S10 Max & Shanghai Sunwin Bus Corporation
|-
| LSG || SAIC-General Motors (For China: Chevrolet, Buick, Cadillac, Sail Springo, For export: Chevrolet)
|-
| LSH || SAIC Maxus van or LDV van & Chevrolet Express Max
|-
| LSJ || SAIC MG & SAIC Roewe & IM Motors & Rising Auto
|-
| LSK || SAIC Maxus or LDV van
|-
| LSV || SAIC-Volkswagen (VW, Skoda, Audi, Tantus)
|-
| LSY || Brilliance (Jinbei, Zhonghua) & Jinbei GM
|-
| LS3 || Hejia New Energy Vehicle Co., Ltd
|-
| LS4 || Changan Automobile (MPV/SUV)
|-
| LS5 || Changan Automobile (car) & Changan Suzuki
|-
| LS6 || Changan Automobile & Deepal Automobile & Avatr
|-
| LS7 || JMC Heavy Duty Truck Co., Ltd.
|-
| LS8 ||Henan Shaolin Auto Co., Ltd. (bus)
|-
| LTA || ZX Auto
|-
| LTN || Soueast-built Chrysler & Dodge vehicles
|-
| LTP || National Electric Vehicle Sweden AB (NEVS)
|-
| LTV || FAW [[../Toyota/VIN Codes|Toyota]] (Tianjin)
|-
| LTW || Zhejiang Dianka Automobile Technology Co. Ltd. (Enovate)
|-
| LT1 || Yangzhou Tonghua Semi-Trailer Co., Ltd. (truck trailer)
|-
| LUC || [[../Honda/VIN Codes|Honda]] Automobile (China)
|-
| LUD || Dongfeng Nissan Diesel Motor Co Ltd.
|-
| LUG || Qiantu Motor
|-
| LUJ || Zhejiang Shanqi Tianying Vehicle Industry Co., Ltd. (motorcycles)
|-
| LUR || Chery Automobile, iCar
|-
| LUX || Dongfeng Yulon Motor Co. Ltd.
|-
| LUZ || Hozon Auto New Energy Automobile Co., Ltd. (Neta)
|-
| LVA || Foton Motor
|-
| LVB || Foton Motor truck
|-
| LVC || Foton Motor bus
|-
| LVF || Changhe Suzuki
|-
| LVG || GAC Toyota (Toyota, Leahead)
|-
| LVH || Dongfeng Honda (Honda, Ciimo)
|-
| LVM || Chery Commercial Vehicle
|-
| LVP || Dongfeng Sokon Motor Company (DFSK)
|-
| LVR || Changan Mazda
|-
| LVS || Changan [[../Ford/VIN Codes|Ford]] (Ford, Lincoln) & Changan Ford Mazda & Volvo S40 and S80L made by Changan Ford Mazda
|-
| LVT || Chery Automobile, Exeed, Jetour, Soueast
|-
| LVU || Chery Automobile, Jetour
|-
| LVV || Chery Automobile, Omoda, Jaecoo
|-
| LVX || Landwind, JMC (discontinued in 2021)
|-
| LVX || Aiways Automobiles Company Ltd
|-
| LVY || Volvo Cars Daqing factory
|-
| LVZ || Dongfeng Sokon Motor Company (DFSK)
|-
| LV3 || Hengchi Automobile (Evergrande Group)
|-
| LV7 || Jinan Qingqi Motorcycle
|-
| LWB || Wuyang Honda Motorcycle (Guangzhou) Co., Ltd.
|-
| LWE || Yangtse Motor Group (bus)
|-
| LWG || Chongqing Huansong Industries (Group) Co., Ltd.
|-
| LWL || Qingling Isuzu
|-
| LWM || Chongqing Wonjan Motorcycle Co., Ltd.
|-
| LWV || GAC Fiat Chrysler Automobiles (Fiat, Jeep)
|-
| LWX || Shanghai Wanxiang Automobile Manufacturing Co., Ltd. (bus)
|-
| LW4 || Li Auto
|-
| LXA || Jiangmen Qipai Motorcycle Co., Ltd.
|-
| LXD || Ningbo Dongfang Lingyun Vehicle Made Co., Ltd. (motorcycle)
|-
| LXG || Xuzhou Construction Machinery Group Co., Ltd. (XCMG)
|-
| LXK || Shanghai Meitian Motorcycle Co., Ltd.
|-
| LXM || Xiamen Xiashing Motorcycle Co., Ltd. (SYM)
|-
| LXN || Link Tour
|-
| LXV || Beijing Borgward Automotive Co., Ltd.
|-
| LXW || JMC - Ford
|-
| LXY || Chongqing Shineray Motorcycle Co., Ltd.
|-
| LX6 || Jiangmen City Huari Group Co. Ltd. (motorcycle)
|-
| LX8 || Chongqing Xgjao (Xinganjue) Motorcycle Co Ltd.
|-
| LYB || Weichai (Yangzhou) Yaxing Automobile Co., Ltd.
|-
| LYD || Taizhou City Kaitong Motorcycle Co., Ltd. (motorcycle)
|-
| LYJ || Beijing ZhongdaYanjing Auto Co., Ltd. (bus)
|-
| LYM || Zhuzhou Jianshe Yamaha Motorcycle Co., Ltd.
|-
| LYS || Nanjing Vmoto Manufacturing Co. Ltd. (motorcycle)
|-
| LYU || Huansu (BAIC Motor & Yinxiang Group)
|-
| LYV || Volvo Cars Chengdu factory & Taizhou, Luqiao District factory
|-
| LY4 || Chongqing Yingang Science & Technology Group Co., Ltd. (motorcycle)
|-
| LZE || Isuzu Guangzhou, China
|-
| LZF || SAIC Iveco Hongyan (-2021), SAIC Hongyan (2021-)
|-
| LZG || Shaanxi Automobile Group (Shacman)
|-
| LZK || Sinotruk (CNHTC) Huanghe bus
|-
| LZL || Zengcheng Haili Motorcycle Ltd.
|-
| LZM || MAN China
|-
| LZP || Zhongshan Guochi Motorcycle (Baotian)
|-
| LZS || Zongshen, Electra Meccanica Vehicles Corp. (Solo) made by Zongshen
|-
| LZU || Guangzhou Isuzu Bus
|-
| LZW || SAIC-GM-Wuling (Wuling, Baojun, Chevrolet [for export])
|-
| LZY || Yutong Bus Co., Ltd.
|-
| LZZ || Sinotruk (CNHTC) (Howo, Sitrak)
|-
| LZ0 || Shandong Wuzheng Group Co., Ltd.
|-
| LZ4 || Jiangsu Linzhi Shangyang Group Co Ltd.
|-
| LZ9/LZX || Raysince
|-
| L0N || Ezytrail (camper trailers)
|-
| L08 || Zhejiang Apollo Sports Technology Co., Ltd. (motorcycles)
|-
| L1K || Chongqing Hengtong Bus Co., Ltd.
|-
| L1N || XPeng Motors
|-
| L10 || Geely Emgrand
|-
| L2B || Jiangsu Baodiao Locomotive Co., Ltd. (motorcycles)
|-
| L2C || Chery Jaguar Land Rover
|-
| L3H || Shanxi Victory Automobile Manufacturing Co., Ltd.
|-
| L37 || Huzhou Daixi Zhenhua Technology Trade Co., Ltd. (motorcycles)
|-
| L4B || Xingyue Group (motorcycles)
|-
| L4F || Suzhou Eagle Electric Vehicle Manufacturing Co., Ltd.
|-
| L4H || Ningbo Longjia Motorcycle Co., Ltd.
|-
| L4S || Zhejiang Xingyue Vehicle Co Ltd. (motorcycles)
|-
| L4Y || Qingqi Group Ningbo Rhon Motorcycle / Ningbo Dalong Smooth Locomotive Industry Co., Ltd.
|-
| L5C || Zhejiang Kangdi Vehicles Co., Ltd. (motorcycles, ATVs)
|-
| L5E || Zoomlion Heavy Industry Science & Technology Co., Ltd.
|-
| L5K || Zhejiang Yongkang Easy Vehicle
|-
| L5N || Zhejiang Taotao (ATV & motorcycles)
|-
| L5R || Jiangsu Dafier Motorcycle Co., Ltd. (motorcycles)
|-
| L5Y || Taizhou Zhongneng Motorcycle Co. Ltd. (Znen)
|-
| L6F || Shandong Liangzi Power Co. Ltd.
|-
| L6J || Zhejiang Kayo Motor Co. Ltd. (ATV)
|-
| L6K || Shanghai Howhit Machinery Manufacture Co. Ltd.
|-
| L6T || Geely, Lynk & Co, Zeekr
|-
| L66 || Zhuhai Granton Bus and Coach Co. Ltd.
|-
| L82 || Baotian
|-
| L85 || Zhejiang Yongkang Huabao Electric Appliance
|-
| L8A || Jinhua Youngman Automobile Manufacturing Co., Ltd.
|-
| L8X || Zhejiang Summit Huawin Motorcycle
|-
| L8Y || Zhejiang Jonway Motorcycle Manufacturing Co., Ltd.
|-
| L9G || Zhuhai Guangtong Automobile Co., Ltd. (bus)
|-
| L9N || Zhejiang Taotao Vehicles Co., Ltd.
|-
| MAA || India Kawasaki Motors Pvt. Ltd.
|-
| MAB || Mahindra & Mahindra
|-
| MAC || Mahindra & Mahindra
|-
| MAH || Fiat India Automobiles Pvt. Ltd
|-
| MAJ || [[../Ford/VIN Codes|Ford]] India
|-
| MAK || [[../Honda/VIN Codes|Honda]] Cars India
|-
| MAL || Hyundai Motor India
|-
| MAN || Eicher Polaris Multix
|-
| MAT || Tata Motors, Rover CityRover
|-
| MA1 || Mahindra & Mahindra
|-
| MA3 || Maruti Suzuki India (domestic & export)
|-
| MA6 || GM India
|-
| MA7 || Hindustan Motors Ltd. & Mitsubishi Motors & Isuzu models made by Hindustan Motors
|-
| MA8 || Daewoo Motor India
|-
| MBF || Royal Enfield
|-
| MBH || Suzuki (for export) & Nissan Pixo made by Maruti Suzuki India Limited
|-
| MBJ || [[../Toyota/VIN Codes|Toyota]] Kirloskar Motor Pvt. Ltd.
|-
| MBK || MAN Trucks India Pvt. Ltd.
|-
| MBL || Hero MotoCorp
|-
| MBR || Mercedes-Benz India
|-
| MBU || Swaraj Vehicles Limited
|-
| MBV || Premier Automobiles Ltd.
|-
| MBX || Piaggio India (Piaggio Ape)
|-
| MBY || Asia Motor Works Ltd.
|-
| MB1 || Ashok Leyland
|-
| MB2 || Hyundai Motor India (SUV)
|-
| MB7 || Reva Electric Car Company/Mahindra Reva Electric Vehicles Pvt. Ltd.
|-
| MB8 || Suzuki Motorcycle India Limited
|-
| MCA || FCA India Automobiles Pvt. Ltd. (Fiat, Jeep)
|-
| MCB || GM India
|-
| MCD || Mahindra Two Wheelers
|-
| MCG || Atul Auto Ltd.
|-
| MCL || International Cars And Motors Ltd.
|-
| MC1 || Force Motors Ltd.
|-
| MC2 || Eicher Motors Ltd./Volvo Eicher Commercial Vehicles Ltd.
|-
| MC4 || Dilip Chhabria Design Pvt Ltd.
|-
| MC9/RE1 || Reva Electric Car Company (Reva G-Wiz)
|-
| MDE || Kinetic Engineering Limited
|-
| MDH || Nissan Motor India Pvt Ltd. (including Datsun)
|-
| MDT || Kerala Automobiles Limited
|-
| MD2 || Bajaj Auto Ltd. & KTM and Husqvarna motorcycles built by Bajaj & Indian-market Triumph motorcycles built by Bajaj
|-
| MD6 || TVS Motor Company
|-
| MD7 || LML Ltd including Genuine Scooter Company Stella
|-
| MD9 || Shuttle Cars India
|-
| MEC || Daimler India Commercial Vehicles (BharatBenz)
|-
| MEE || Renault India Private Limited
|-
| MEG || Harley-Davidson India
|-
| MER || Benelli India
|-
| MES || Mahindra Navistar
|-
| MET || Piaggio India (Vespa, Indian-market Aprilia)
|-
| MEX || Škoda Auto Volkswagen India Pvt. Ltd. 2015 on
|-
| ME1 || India Yamaha Motor Pvt. Ltd.
|-
| ME3 || Royal Enfield
|-
| ME4 || Honda Motorcycle and Scooter India
|-
| MYH || Ather Energy
|-
| MZB || Kia India Pvt. Ltd.
|-
| MZD || Classic Legends Private Limited – Jawa
|-
| MZZ || Citroen India (PCA Automobiles India Private Limited)
|-
| MZ7 || MG Motor India Pvt. Ltd.
|-
| M3G || Isuzu Motors India
|-
| M6F || UM Lohia Two Wheelers Private Limited
|-
| ME9/ || BUYMYEV TECHNOLOGY PVT. LTD. (Indibike)
|-
| MF3 || PT Hyundai Motor Manufacturing Indonesia
|-
| MHB || PT Nissan Motor Indonesia
|-
| MHD || PT Indomobil Suzuki International
|-
| MHF || PT [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing Indonesia
|-
| MHK || PT Astra Daihatsu Motor (includes Toyotas made by Astra Daihatsu)
|-
| MHL || PT Mercedes-Benz Indonesia
|-
| MHR || [[../Honda/VIN Codes|Honda]] Indonesia (PT Honda Prospect Motor) (car)
|-
| MHY || PT Suzuki Indomobil Motor (car, MPV, van)
|-
| MH1 || PT Astra Honda Motor (motorcycle)
|-
| MH3 || PT Yamaha Indonesia Motor Mfg.
|-
| MH4 || PT Kawasaki Motor Indonesia
|-
| MH8 || PT Suzuki Indomobil Motor (motorcycle)
|-
| MJB || GM Indonesia
|-
| MKF || PT Sokonindo Automobile (DFSK)
|-
| MK2 || PT Mitsubishi Motors Krama Yudha Indonesia
|-
| MK3 || PT SGMW Motor Indonesia (Wuling)
|-
| MLB || Siam Yamaha Co Ltd.
|-
| MLC || Thai Suzuki Motor Co., Ltd. (motorcycle)
|-
| MLE || Thai Yamaha Motor Co., Ltd.
|-
| MLH || Thai [[../Honda/VIN Codes|Honda]] Manufacturing Co., Ltd. (motorcycle)
|-
| MLW || Sco Motor Co., Ltd. (motorcycle)
|-
| MLY || Harley-Davidson Thailand
|-
| ML0 || Ducati Motor (Thailand) Co., Ltd.
|-
| ML3 || Mitsubishi Motors, Dodge Colt 100 [Canada], [[w:Dodge Attitude#Third generation (A10; 2015)|Dodge Attitude]] [Mexico] made by Mitsubishi (Thailand)
|-
| ML5 || Kawasaki Motors Enterprise Co. Ltd. (Thailand)
|-
| MMA || Mitsubishi Motors (Thailand)
|-
| MMB || Mitsubishi Motors (Thailand)
|-
| MMC || Mitsubishi Motors (Thailand)
|-
| MMD || Mitsubishi Motors (Thailand)
|-
| MME || Mitsubishi Motors (Thailand)
|-
| MMF || BMW Manufacturing (Thailand) Co., Ltd.
|-
| MML || MG Thailand (SAIC-CP)
|-
| MMM || Chevrolet Thailand, Holden Colorado RC pickup
|-
| MMR || Subaru/Tan Chong Subaru Automotive (Thailand) Co. Ltd.
|-
| MMS || Suzuki Motor (Thailand) Co., Ltd. (passenger car)
|-
| MMT || Mitsubishi Motors (Thailand)
|-
| MMU || Holden Thailand (Colorado RG, Colorado 7, & Trailblazer)
|-
| MM0, MM6, MM7, MM8 || Mazda Thailand (Ford-Mazda AutoAlliance Thailand plant)
|-
| MNA || [[../Ford/VIN Codes|Ford]] Thailand (Ford-Mazda AutoAlliance Thailand plant) for Australia/New Zealand export
|-
| MNB || [[../Ford/VIN Codes|Ford]] Thailand (Ford-Mazda AutoAlliance Thailand plant) for other right-hand drive markets
|-
| MNC || [[../Ford/VIN Codes|Ford]] Thailand (Ford-Mazda AutoAlliance Thailand plant) for left-hand drive markets
|-
| MNK || Hino Motors Manufacturing Thailand Co Ltd.
|-
| MNT || Nissan Motor (Thailand) Co., Ltd.
|-
| MNU || Great Wall Motor Manufacturing (Thailand) Co., Ltd.
|-
| MN3 || Eagle Vista [Canada] made by Mitsubishi (Thailand)
|-
| MPA || Isuzu Motors (Thailand) Co., Ltd. & Holden Rodeo RA pickup made by Isuzu in Thailand
|-
| MPB || [[../Ford/VIN Codes|Ford]] Thailand (Ford Thailand Manufacturing plant)
|-
| MP1 || Isuzu Motors (Thailand) Co., Ltd.
|-
| MP2 || Mazda BT-50 pickup built by Isuzu Motors (Thailand) Co., Ltd.
|-
| MP3 || Plymouth Colt 100 [Canada] made by Mitsubishi (Thailand)
|-
| MP5 || Foton Motor Thailand
|-
| MRH || [[../Honda/VIN Codes|Honda]] Thailand (car)
|-
| MRT || Neta (Hozon Auto) made by Bangchan General Assembly Co., Ltd.
|-
| MR0 || [[../Toyota/VIN Codes|Toyota]] Thailand (pickups & Fortuner SUV)
|-
| MR1 || [[../Toyota/VIN Codes|Toyota]] Thailand
|-
| MR2 || [[../Toyota/VIN Codes|Toyota]] Thailand (Gateway plant) (passenger cars & CUVs)
|-
| MR3 || [[../Toyota/VIN Codes|Toyota]] Thailand (Hilux Champ chassis cab)
|-
| MS0 || [[../SUPER SEVEN STARS MOTORS INDUSTRY CO.,LTD/VIN Codes|Super Seven Stars Motors]] Myanmar
|-
| MS1 || [[../SUPER SEVEN STARS AUTOMOTIVE CO.,LTD/VIN Codes|Super Seven Stars Automotive]] Myanmar
|-
| MS3 || Suzuki Myanmar Motor Co., Ltd.
|-
| MXB || Saryarka AvtoProm bus (Kazakhstan)
|-
| MXL || Yutong bus made by Qaz Tehna (Kazakhstan)
|-
| MXV || IMZ-Ural Ural Motorcycles (Kazakhstan)
|-
| MX3 || Hyundai Trans Auto (Kazakhstan)
|-
| NAA || Iran Khodro (Peugeot Iran)
|-
| NAC || Mammut (truck trailers)
|-
| NAD || Škoda
|-
| NAL || Maral Sanat Jarvid (truck trailers)
|-
| NAP || Pars Khodro
|-
| NAS || SAIPA
|-
| NC0 || Oghab Afshan (bus)
|-
| NC9/ || VIRA Diesel
|-
| ND9/345 || Oghab Afshan (bus)
|-
| NFB || Honda Atlas Cars Pakistan Ltd.
|-
| NG3 || Lucky Motor Corporation
|-
| NLA || Honda Turkiye A.S. cars
|-
| NLC || Askam Kamyon Imalat Ve Ticaret A.S.
|-
| NLE || Mercedes-Benz Türk A.S. Truck
|-
| NLF || Koluman Otomotiv Endustri A.S. (truck trailer)
|-
| NLH || [[../Hyundai/VIN Codes|Hyundai]] Assan Otomotiv car/SUV
|-
| NLJ || [[../Hyundai/VIN Codes|Hyundai]] Assan Otomotiv van
|-
| NLN || Karsan
|-
| NLR || Otokar
|-
| NLT || Temsa
|-
| NLZ || Tezeller
|-
| NL1 || TOGG
|-
| NL2 || HABAS/HBS (bus)
|-
| NMA || MAN Türkiye A.Ş.
|-
| NMB || Mercedes-Benz Türk A.S. Buses
|-
| NMC || BMC Otomotiv Sanayi ve Ticaret A.Ş.
|-
| NMH || Honda Anadolu motorcycle
|-
| NMS || Otoyol San. A.Ş.
|-
| NMT || [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing Turkey
|-
| NM0 || Ford Otosan
|-
| NM1 || Oyak Renault Otomobil Fabrikaları A.Ş.
|-
| NM4 || Tofaş (Turk Otomobil Fabrikasi AS)
|-
| NNA || Anadolu Isuzu
|-
| NNN || Gépébus Oréos 4X (based on Otokar Vectio)
|-
| NNY || Yeksan (truck trailer)
|-
| NPM || Seyit Usta Treyler (truck trailer)
|-
| NPR || Oztreyler (truck trailer)
|-
| NPS || Nursan (truck trailer)
|-
| NP8|| ÖZGÜL TREYLER (truck trailer)
|-
| NP9/002 || OKT Trailer (truck trailer)
|-
| NP9/003 || Aksoylu Trailer (truck trailer)
|-
| NP9/011 || Güleryüz (bus)
|-
| NP9/021 || Dogumak (truck trailer)
|-
| NP9/022 || Alim (truck trailer)
|-
| NP9/042 || Ali Rıza Usta (truck trailer)
|-
| NP9/066 || Makinsan (truck trailer)
|-
| NP9/093 || BRF Trailer (truck trailer)
|-
| NP9/103 || Türkkar (bus)
|-
| NP9/106 || Çarsan Treyler (truck trailer)
|-
| NP9/107 || Arbus Perfect (bus)
|-
| NP9/108 || Guven Makina (truck trailer)
|-
| NP9/117 || Katmerciler (truck trailer)
|-
| NP9/300 || TCV (bus)
|-
| NP9/258 || Ceytrayler (truck trailer)
|-
| NP9/306 || Cryocan (truck trailer)
|-
| NRE || Bozankaya
|-
| NRX || Musoshi
|-
| NRY || Pilotcar Otomotiv
|-
| NR9/012 || Doğan Yıldız (truck trailer)
|-
| NR9/028 || Micansan (truck trailer)
|-
| NR9/029 || Yilteks (truck trailer)
|-
| NR9/034 || Akia (bus)
|-
| NR9/084 || Harsan (truck trailer)
|-
| NR9/257 || Vega Trailer (truck trailer)
|-
| NSA || SamAvto / SAZ (Uzbekistan)
|-
| NS2 || JV MAN Auto - Uzbekistan
|-
| NVA || Khazar (IKCO Dena made in Azerbaijan)
|-
| PAB || Isuzu Philippines Corporation
|-
| PAD || Honda Cars Philippines
|-
| PE1 || Ford Motor Company Philippines
|-
| PE3 || Mazda Philippines made by Ford Motor Company Philippines
|-
| PFD || Hyundai Motor Group Innovation Center in Singapore (HMGICS)
|-
| PL1 || Proton, Malaysia
|-
| PL8 || Inokom-Hyundai
|-
| PLP || Subaru/Tan Chong Motor Assemblies, Malaysia
|-
| PLZ || Isuzu Malaysia
|-
| PMA || MAN Truck & Bus Malaysia
|-
| PMH || Honda Malaysia (car)
|-
| PMK || Honda Boon Siew (motorcycle)
|-
| PML || Hicom
|-
| PMN || Modenas
|-
| PMS || Suzuki Assemblers Malaysia (motorcycle)
|-
| PMV || Hong Leong Yamaha Motor Sdn. Bhd.
|-
| PMY || Hong Leong Yamaha Motor Sdn. Bhd.
|-
| PM1 || BMW & Mini/Inokom
|-
| PM2 || Perodua
|-
| PM9/ || Bufori
|-
| PNA || Naza/Kia/Peugeot
|-
| PNA || Stellantis Gurun (Malaysia) Sdn. Bhd. (Peugeot)
|-
| PNS || SKSBUS Malaysia (bus)
|-
| PNS || TMSBUS Malaysia (bus)
|-
| PNV || Volvo Car Manufacturing Malaysia
|-
| PN1 || UMW Toyota Motor - Assembly Services Sdn. Bhd. (ASSB)
|-
| PN2 || UMW Toyota Motor - Assembly Services Sdn. Bhd. (ASSB)
|-
| PN8 || Nissan/Tan Chong Motor Assemblies, Malaysia
|-
| PPP || Suzuki
|-
| PPV || Volkswagen/HICOM Automotive Manufacturers (Malaysia)
|-
| PP1 || Mazda/Inokom
|-
| PP3 || Hyundai/Inokom
|-
| PRA || Sinotruk
|-
| PRH || Chery (by Chery Alado Holdings [joint venture] at Oriental Assemblers plant)
|-
| PRX || Kia/Inokom
|-
| PR8 || Ford
|-
| PRN || GAC Trumpchi made by Warisan Tan Chong Automotif Malaysia
|-
| PV3 || Ford made by RMA Automotive Cambodia
|-
| RA1 || Steyr Trucks International FZE, UAE
|-
| RA9/015 || Al-Assri Industries (Trailers), UAE
|-
| LES || Isuzu MPV made by Sanfu Motor Industrial Co., Ltd. (Trooper '87-'91) (Taiwan)
|-
| LFA || Ford Lio Ho Motor Co Ltd. old designation (Taiwan)
|-
| LM1 || Tai Ling Motor Co Ltd. old designation (Suzuki motorcycle made by Tai Ling) (Taiwan)
|-
| LM4 || Tai Ling Motor Co Ltd. old designation (Suzuki ATV made by Tai Ling) (Taiwan)
|-
| LM5 || Isuzu Truck (Light Duty) made by Sanfu Motor Industrial Co., Ltd. (Trooper '87-'88) (Taiwan)
|-
| LN1 || Tai Ling Motor Co Ltd. old designation (Suzuki motorcycle made by Tai Ling) (Taiwan)
|-
| LPR || Yamaha Motor Taiwan Co. Ltd. old designation (Taiwan)
|-
| RFB || Kwang Yang Motor Co., Ltd. (Kymco), Taiwan
|-
| RFC || Taiwan Golden Bee
|-
| RFD || Tai Ling Motor Co Ltd. new designation (Taiwan)
|-
| RFG || Sanyang Motor Co., Ltd. (SYM) Taiwan
|-
| RFL || Her Chee Industrial Co., Ltd. (Adly), Taiwan
|-
| RFT || CPI Motor Company, Taiwan
|-
| RFV || Motive Power Industry Co., Ltd. (PGO Scooters including Genuine Scooter Company models made by PGO) (Taiwan)
|-
| RF3 || Aeon Motor Co., Ltd., Taiwan
|-
| RF5 || Yulon Motor Co. Ltd., Taiwan (Luxgen)
|-
| RF8 || EVT Technology Co., Ltd (motorcycle)
|-
| RGS || Kawasaki made by Kymco (Taiwan)
|-
| RHA || Ford Lio Ho Motor Co Ltd. new designation (Taiwan)
|-
| RKJ || Prince Motors Taiwan
|-
| RKL || Kuozui Motors (Toyota) (Taiwan)
|-
| RKM || China Motor Corporation (Taiwan)
|-
| RKR || Yamaha Motor Taiwan Co. Ltd. new designation
|-
| RKT || Access Motor Co., Ltd. (Taiwan)
|-
| RK3 || E-Ton Power Tech Co., Ltd. (motorcycle) (Taiwan)
|-
| RK3 || Honda Taiwan
|-
| RK7 || Kawasaki ATV made by Tai Ling Motor Co Ltd (rebadged Suzuki ATV) new designation (Taiwan)
|-
| RLA || Vina Star Motors Corp. – Mitsubishi (Vietnam)
|-
| RLC || Yamaha Motor Vietnam Co. Ltd.
|-
| RLE || Isuzu Vietnam Co.
|-
| RLH || Honda Vietnam Co. Ltd.
|-
| RLL || VinFast SUV
|-
| RLM || Mercedes-Benz Vietnam
|-
| RLN || VinFast
|-
| RLV || Vietnam Precision Industrial CO., Ltd. (Can-Am DS 70 & DS 90)
|-
| RL0 || Ford Vietnam
|-
| RL4 || Toyota Motor Vietnam
|-
| RP8 || Piaggio Vietnam Co. Ltd.
|-
| RUN || Sollets-Auto ST6 (Russia)
|-
| R1J || Jiayuan Power (Hong Kong) Ltd. (Electric Low-Speed Vehicles) (Hong Kong)
|-
| R1N || Niu Technologies Group Ltd. (Hong Kong)
|-
| R10 || ZAP (HK) Co. Ltd.
|-
| R19/003 || GMI (bus) (Hong Kong)
|-
| R2P || Evoke Electric Motorcycles (Hong Kong)
|-
| R3M || Mangosteen Technology Co., Ltd. (Hong Kong)
|-
| R36 || HK Shansu Technology Co., Ltd. (Hong Kong)
|-
| R4N || Elyx Smart Technology Holdings (Hong Kong) Ltd.
|-
| R82 || Hangzhou Lantu Technology Co., Ltd. (Hong Kong)
|-
| SAA || Austin
|-
| SAB || Optare (1985-2020), Switch Mobility (2021-)
|-
| SAD || Daimler Company Limited (until April 1987)
|-
| SAD || Jaguar SUV (E-Pace, F-Pace, I-Pace)
|-
| SAF || ERF trucks
|-
| SAH || Honda made by Austin Rover Group
|-
| SAJ || Jaguar passenger car & Daimler passenger car (after April 1987)
|-
| SAL || [[../Land Rover/VIN Codes|Land Rover]]
|-
| SAM || Morris
|-
| SAR || Rover & MG Rover Group
|-
| SAT || Triumph car
|-
| SAX || Austin-Rover Group including Sterling Cars
|-
| SAY || Norton Motorcycles (UK) Ltd. (Donington Park/Donington Hall)
|-
| SAZ || Freight Rover
|-
| SA3 || Ginetta Cars
|-
| SA9/ || OX Global
|-
| SA9/A11 || Morgan Roadster (V6) (USA)
|-
| SA9/J00 || Morgan Aero 8 (USA)
|-
| SA9/004 || Morgan (4-wheel passenger cars)
|-
| SA9/005 || Panther
|-
| SA9/010 || Invicta S1
|-
| SA9/011 || Midas Cars
|-
| SA9/019 || TVR
|-
| SA9/022 || Triking Sports Cars
|-
| SA9/026 || Fleur de Lys
|-
| SA9/036 || Ginetta Cars
|-
| SA9/038 || DAX Cars
|-
| SA9/039 || Westfield Sportscars
|-
| SA9/048 || McLaren F1
|-
| SA9/050 || Marcos Engineering
|-
| SA9/062 || AC Cars (Brooklands Ace)
|-
| SA9/068 || Johnston Sweepers
|-
| SA9/073 || Tomita Auto UK (Tommykaira ZZ)
|-
| SA9/074 || Ascari
|-
| SA9/088 || Spectre Angel
|-
| SA9/105 || Mosler Europe Ltd.
|-
| SA9/113 || Noble
|-
| SA9/130 || MG Sport and Racing
|-
| SA9/141 || Wrightbus
|-
| SA9/202 || Morgan 3-Wheeler, Super 3
|-
| SA9/207 || Radical Sportscars
|-
| SA9/211 || BAC (Briggs Automotive Company Ltd.)
|-
| SA9/225 || Paneltex (truck trailer)
|-
| SA9/231 || Peel Engineering
|-
| SA9/337 || Ariel
|-
| SA9/341 || Zenos
|-
| SA9/438 || Charge Cars
|-
| SA9/458 || Gordon Murray Automotive
|-
| SA9/474 || Mellor (bus)
|-
| SA9/612 || Tiger Racing (kit car)
|-
| SA9/621 || AC Cars (Ace)
|-
| SBB || Leyland Vehicles
|-
| SBC || Iveco Ford Truck
|-
| SBF || Nugent (trailer)
|-
| SBJ || Leyland Bus
|-
| SBL || Leyland Motors & Leyland DAF
|-
| SBM || McLaren
|-
| SBS || Scammell
|-
| SBU || United Trailers (truck trailer)
|-
| SBV || Kenworth & Peterbilt [incomplete vehicle] made by Leyland Trucks
|-
| SBW || Weightlifter Bodies (truck trailer)
|-
| SB1 || [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing UK
|-
| SCA || Rolls Royce passenger car
|-
| SCB || Bentley passenger car
|-
| SCC || Lotus Cars & Opel Lotus Omega/Vauxhall Lotus Carlton
|-
| SCD || Reliant Motors
|-
| SCE || DeLorean Motor Cars N. Ireland (UK)
|-
| SCF || Aston Martin Lagonda Ltd. passenger car & '21 DBX SUV
|-
| SCG || Triumph Engineering Co. Ltd. (original Triumph Motorcycle company)
|-
| SCK || Ifor Williams Trailers
|-
| SCM || Manitowoc Cranes - Grove
|-
| SCR || London Electric Vehicle Company & London Taxi Company & London Taxis International
|-
| SCV || Volvo Truck & Bus Scotland
|-
| SC5 || Wrightbus (from ~2020)
|-
| SC6 || INEOS Automotive SUV
|-
| SDB || Talbot
|-
| SDC || SDC Trailers Ltd. (truck trailer)
|-
| SDF || Dodge Trucks – UK 1981–1984
|-
| SDG || Renault Trucks Industries 1985–1992
|-
| SDK || Caterham Cars
|-
| SDL || TVR
|-
| SDP || NAC MG UK & MG Motor UK Ltd.
|-
| SDU || Utility (truck trailer)
|-
| SD7 || Aston Martin SUV
|-
| SD8 || Moke International Ltd.
|-
| SED || IBC Vehicles (General Motors Luton Plant) (Opel/Vauxhall, 1st gen. Holden Frontera, Isuzu Midi)
|-
| SEG || Dennis Eagle Ltd., including Renault Trucks Access and D Access
|-
| SEP || Don-Bur (truck trailer)
|-
| SEY || LDV Group Ltd.
|-
| SFA || [[../Ford/VIN Codes|Ford]] UK
|-
| SFD || Dennis UK / Alexander Dennis
|-
| SFE || Alexander Dennis UK
|-
| SFR || Fruehauf (truck trailer)
|-
| SFN || Foden Trucks & Kenworth [truck] made by Foden Trucks
|-
| SFZ || Tesla Roadster made by Lotus
|-
| SGA || Avondale (caravans)
|-
| SGB || Bailey (caravans)
|-
| SGD || Swift Group Ltd. (caravans)
|-
| SGE || Elddis (caravans)
|-
| SGL || Lunar Caravans Ltd.
|-
| SG4 || Coachman Caravan Co. Ltd.
|-
| SG7 || ABI Caravans Ltd.
|-
| SHH || [[../Honda/VIN Codes|Honda]] UK passenger car
|-
| SHS || [[../Honda/VIN Codes|Honda]] UK SUV
|-
| SH2 || The Norton Motorcycle Co., Ltd. (TVS Motor Co. subsidiary)
|-
| SH7 || INEOS Automotive truck
|-
| SJA || Bentley SUV
|-
| SJB || Brian James Trailers Ltd
|-
| SJK || Nissan Motor Manufacturing UK - Infiniti
|-
| SJN || Nissan Motor Manufacturing UK - Nissan
|-
| SJ1 || Ree Automotive
|-
| SKA || Vauxhall
|-
| SKB || Kel-Berg Trailers & Trucks
|-
| SKF || Bedford Vehicles
|-
| SKL || Anaig (UK) Technology Ltd
|-
| SKM || King Military Engineering Ltd.
|-
| SLA || Rolls Royce SUV
|-
| SLC || Thwaites Dumpers
|-
| SLG || McMurtry Automotive
|-
| SLN || Niftylift
|-
| SLP || JC Bamford Excavators Ltd.
|-
| SLV || Volvo bus
|-
| SMR || Montracon (truck trailer)
|-
| SMT || Triumph Motorcycles Ltd. (current Triumph Motorcycle company)
|-
| SMW || Cartwright (truck trailer)
|-
| SMX || Gray & Adams (truck trailer)
|-
| SNE || Barkas (East Germany)
|-
| SNE || Wartburg (East Germany)
|-
| SNT || Trabant (East Germany)
|-
| SNZ || MZ (motorcycle) (Germany)
|-
| SPE || B-ON GmbH (Germany)
|-
| ST3 || Calabrese (truck trailer)
|-
| SUA || Autosan (bus)
|-
| SUB || Tramp Trail (trailer)
|-
| SUC || Wiola (trailer)
|-
| SUD || Wielton (truck trailers)
|-
| SUF || FSM/Fiat Auto Poland (Polski Fiat)
|-
| SUG || Mega Trailers (truck trailer) (Poland)
|-
| SUJ || Jelcz (Poland)
|-
| SUL || FSC (Poland)
|-
| SUM || Novatrail (truck trailers)
|-
| SUP || FSO/Daewoo-FSO (Poland)
|-
| SUU || Solaris Bus & Coach (Poland)
|-
| SU9/AR1 || Emtech (truck trailer)
|-
| SU9/BU1 || BODEX (truck trailer)
|-
| SU9/DE2 || Demarco (truck trailer)
|-
| SU9/EB1 || Elbo (truck trailer)
|-
| SU9/EZ1 || Enerco (truck trailer)
|-
| SU9/NC5 || Zasta (truck trailer)
|-
| SU9/NJ1 || Janmil (truck trailer)
|-
| SU9/PL1 || Plandex (truck trailer)
|-
| SU9/PN1 || Solaris Bus & Coach (Poland) - until 2004
|-
| SU9/RE1 || Redos (truck trailer)
|-
| SU9/RE2 || Gromex (trailer)
|-
| SU9/TR1 || Plavec (truck trailer)
|-
| SU9/YV1 || Pilea bus/ARP E-Vehicles (Poland)
|-
| SU9/ZC1 || Wolf (truck trailer)
|-
| SVH || ZASŁAW (truck trailer)
|-
| SVM || Inter Cars (truck trailer)
|-
| SVS || BODEX (truck trailer)
|-
| SV9/BC2 || BC-LDS (truck trailer)
|-
| SV9/DR1 || Dromech (truck trailer)
|-
| SV9/RN1 || Prod-Rent (truck trailer)
|-
| SWH || Temared (trailers)
|-
| SWR || Weekend Trailers (trailers)
|-
| SWV || TA-NO (Poland)
|-
| SWZ || Zremb (trailers)
|-
| SW9/BA1 || Solbus
|-
| SW9/WG3 || Grew / Opalenica (trailer)
|-
| SXE || Neptun Trailers
|-
| SXK || Konar (truck trailer)
|-
| SXM || MELEX Sp. z o.o.
|-
| SXY || Wecon (truck trailer)
|-
| SXX || Martz (trailer)
|-
| SX7 || Arthur Bus
|-
| SX9/GR0 || GRAS (truck trailer)
|-
| SX9/KT1 || AMZ - Kutno (bus)
|-
| SX9/PN1 || Polkon (truck trailer)
|-
| SX9/SP1 || SOMMER Polska (truck trailer)
|-
| SYB || Rydwan (trailer)
|-
| SYG || Gniotpol, GT Trailers Sp. z o. o. (truck trailer)
|-
| SY1 || Neso Bus (PAK-PCE Polski Autobus Wodorowy)
|-
| SY9/FR1 || Feber (truck trailer)
|-
| SY9/PF1 || KEMPF (truck trailer)
|-
| SZA || Scania Poland
|-
| SZC || Vectrix (motorcycle)
|-
| SZL || Boro Trailers
|-
| SZN || Przyczepy Głowacz (trailer)
|-
| SZR || Niewiadów (trailer)
|-
| SZ9/AE6 || Gewe (trailer)
|-
| SZ9/BG1 || GALA Syriusz (trailer)
|-
| SZ9/PW1 || PRO-WAM (truck trailer)
|-
| SZ9/TU1 || Ovibos (truck trailer)
|-
| S19/AM0 || AMO Plant (bus) (Latvia)
|-
| S19/EF1 || Electrify (minibus) (Latvia)
|-
| S19/MT0 || Mono-Transserviss (truck trailer) (Latvia)
|-
| TAW || NAW Nutzfahrzeuggesellschaft Arbon & Wetzikon AG (Switzerland)
|-
| TBS || Boschung AG (Switzerland)
|-
| TCC || Micro Compact Car AG (smart 1998-1999) (Switzerland)
|-
| TDM || QUANTYA Swiss Electric Movement (Switzerland)
|-
| TEB || Bucher Municipal AG (includes Johnston Sweepers) (Switzerland)
|-
| TEM || Twike (SwissLEM AG) (Switzerland)
|-
| TFH || FHS Frech-Hoch AG (truck trailer) (Switzerland)
|-
| TH9/512 || Hess AG (bus, trolleybus) (Switzerland)
|-
| TJ5 || Vezeko (trailer) (Czech Republic)
|-
| TKP || Panav a.s. (truck trailer) (Czech Republic)
|-
| TKX || Agados s.r.o. (trailer) (Czech Republic)
|-
| TKY || Metaco (truck trailer) (Czech Republic)
|-
| TK9/AH3 || Atmos Chrást s.r.o. (Czech Republic)
|-
| TK9/AP3 || Agados, spol. s.r.o. (trailer) (Czech Republic)
|-
| TK9/HP1 || Hipocar (truck trailer) (Czech Republic)
|-
| TK9/PP7 || Paragan Trucks (truck trailer) (Czech Republic)
|-
| TK9/SL5 || SOR Libchavy buses (Czech Republic)
|-
| TK9/SS5 || SVAN Chrudim (truck trailer) (Czech Republic)
|-
| TLJ || Jawa Moto (Czech Republic)
|-
| TMA || [[../Hyundai/VIN Codes|Hyundai]] Motor Manufacturing Czech
|-
| TMB || Škoda Auto|Škoda (Czech Republic)
|-
| TMC || [[../Hyundai/VIN Codes|Hyundai]] Motor Manufacturing Czech (SUV)
|-
| TMK || Karosa (Czech Republic)
|-
| TMP || Škoda trolleybuses (Czech Republic)
|-
| TMT || Tatra passenger car (Czech Republic)
|-
| TM9/CA2 || Oasa bus (Oprava a stavba automobilů) (Czech Republic)
|-
| TM9/SE3 || Škoda Transportation trolleybuses (Czech Republic)
|-
| TM9/SE4 || Škoda Transportation trolleybuses (Czech Republic)
|-
| TM9/TE6 || TEDOM bus (Czech Republic)
|-
| TNA || Avia/Daewoo Avia
|-
| TNE || TAZ
|-
| TNG || LIAZ (Liberecké Automobilové Závody)
|-
| TNT || Tatra trucks
|-
| TNU || Tatra trucks
|-
| TN9/EE7 || Ekova (bus) (Czech Republic)
|-
| TN9/VP5 || VPS (truck trailer)
|-
| TRA || Ikarus Bus
|-
| TRC || Csepel bus
|-
| TRE || Rákos bus
|-
| TRK || Credo bus/Kravtex (Hungary)
|-
| TRR || Rába Bus (Hungary)
|-
| TRU || Audi Hungary (TT/TTS, '12-'13 TT RS)
|-
| TSB || Ikarus Bus
|-
| TSC || VIN assigned by the National Transport Authority of Hungary
|-
| TSE || Ikarus Egyedi Autobuszgyar (EAG) (Hungary)
|-
| TSF || Alfabusz (Hungary)
|-
| TSM || Suzuki Hungary (Magyar Suzuki),<br> Fiat Sedici made by Suzuki, Subaru Justy G3X made by Suzuki, Suzuki Swace made by Toyota UK (TMUK)
|-
| TSY || Keeway Motorcycles (Hungary)
|-
| TS9/111 || NABI Autóbuszipari (bus) (Hungary)
|-
| TS9/130 || Enterprise Bus (Hungary)
|-
| TS9/131 || MJT bus (Hungary)
|-
| TS9/156 || Ikarus / ARC (Auto Rad Controlle Kft.) bus (Hungary)
|-
| TS9/167 || Hungarian Bus Kft. (Hungary)
|-
| TS9/170 || Csaba Metál bus (Hungary)
|-
| TT9/117 || Ikarus Egyedi Autobusz Gyarto Kft. / Magyar Autóbuszgyártó Kft. / MABI (Hungary)
|-
| TT9/123 || Ikarus Global Zrt. (Hungary)
|-
| TWG || CaetanoBus (Portugal)
|-
| TW0 || CaetanoBus (Portugal)
|-
| TW1 || Toyota Caetano Portugal, S.A. (Toyota Coaster, Dyna, Optimo, Land Cruiser 70 Series)
|-
| TW2 || [[../Ford/VIN Codes|Ford]] Lusitana (Portugal)
|-
| TW4 || UMM (Portugal)
|-
| TW6 || Citroën (Portugal)
|-
| TW7 || Mini Moke made by British Leyland & Austin Rover Portugal
|-
| TX5 || Mini Moke made by Cagiva (Moke Automobili)
|-
| TX9/046 || Riotrailer (truck trailer) (Portugal)
|-
| TYA || Mitsubishi Fuso Truck and Bus Corp. Portugal (right-hand drive)
|-
| TYB || Mitsubishi Fuso Truck and Bus Corp. Portugal (left-hand drive)
|-
| T3C || Lohr Backa Topola (truck trailer) (Serbia)
|-
| T49/BG7 || FAP (Serbia)
|-
| T49/BH8 || Megabus (bus) (Serbia)
|-
| T49/BM2 || Feniksbus (minibus) (Serbia)
|-
| T49/V16 || MAZ made by BIK (bus) (Serbia)
|-
| T7A || Ebusco (Netherlands)
|-
| UA1 || AUSA Center (Spain)
|-
| UA2 || Iveco Massif & Campagnola made by Santana Motors in Spain
|-
| UA4 || Irizar e-mobility (Spain)
|-
| UCY || Silence Urban Ecomobility (Spain)
|-
| UD3 || Granalu truck trailers (Belgium)
|-
| UHE || Scanvogn (trailer) (Denmark)
|-
| UHL || Camp-let (recreational vehicle) (Denmark)
|-
| UH2 || Brenderup (trailer) (Denmark)
|-
| UH2 || De Forenede Trailerfabrikke (trailer) (Denmark)
|-
| UH9/DA3 || DAB - Danish Automobile Building (acquired by Scania) (Denmark)
|-
| UH9/EM1 || Egholm (Denmark)
|-
| UH9/FK1 || Dapa Trailer (truck trailer) (Denmark)
|-
| UH9/HF1 || HFR Trailer A/S (truck trailer) (Denmark)
|-
| UH9/HM1 || HMK Bilcon A/S (truck trailer) (Denmark)
|-
| UH9/NS1 || Nopa (truck trailer) (Denmark)
|-
| UH9/NT1 || Nordic Trailer (truck trailer) (Denmark)
|-
| UH9/VM2 || VM Tarm a/s (truck trailer) (Denmark)
|-
| UJG || Garia ApS - Club Car (Denmark)
|-
| UKR || Hero Camper (Denmark)
|-
| UMT || MTDK a/s (truck trailer) (Denmark)
|-
| UN1 || [[../Ford/VIN Codes|Ford]] Ireland
|-
| UN9/012 || Duffy Coachbodies (Ireland)
|-
| UN9/089 || Brian Noone Ltd. bus (Ireland)
|-
| UU1 || Dacia (Romania)
|-
| UU2 || Oltcit
|-
| UU3 || ARO
|-
| UU4 || Roman/Grivbuz
|-
| UU5 || Rocar
|-
| UU6 || Daewoo Romania
|-
| UU7 || Euro Bus Diamond
|-
| UU9 || Astra Bus
|-
| UVW || UMM (truck trailer)
|-
| UV9/AT1 || ATP Trucks, ATP Bus
|-
| UWR || Robus Reșița
|-
| UZT || UTB (Uzina de Tractoare Brașov)
|-
| U1A || Sanos (North Macedonia)
|-
| U1V || VDL Van Hool Macedonia (North Macedonia)
|-
| U5Y || Kia Motors Slovakia
|-
| U59/AS0 || ASKO (truck trailer)
|-
| U6A || Granus (bus) (Slovakia)
|-
| U6Y || Kia Motors Slovakia
|-
| U69/NL1 || Novoplan (bus) (Slovakia)
|-
| U69/SB1 || SlovBus (bus)
|-
| U69/TR8 || Troliga Bus (Slovakia)
|-
| VAG || Steyr-Daimler-Puch Puch G & Steyr-Puch Pinzgauer
|-
| VAH || Hangler (truck trailer)
|-
| VAK || Kässbohrer Transport Technik
|-
| VAN || MAN Austria/Steyr-Daimler-Puch Steyr Trucks
|-
| VAV || Schwarzmüller
|-
| VAX || Schwingenschlogel (truck trailer)
|-
| VA0 || ÖAF, Gräf & Stift
|-
| VA4 || KSR Group (motorcycle)
|-
| VA9/GS0 || Gsodam Fahrzeugbau (truck trailer)
|-
| VA9/RB1 || Rosenbauer International AG (truck)
|-
| VA9/ZT0 || Berger Fahrzeugtechnik (truck trailer)
|-
| VBF || Fit-Zel (trailer)
|-
| VBK || KTM
|-
| VBK || Husqvarna Motorcycles & Gas Gas under KTM ownership
|-
| VCF || Fisker Inc. (Fisker Ocean) made by Magna Steyr
|-
| VFA || Alpine (A310, A610, A110, A390), Renault Alpine GTA
|-
| VFG || Caravelair (caravans)
|-
| VFK || Fruehauf (truck trailers)
|-
| VFN || Trailor, General Trailers (truck trailers)
|-
| VF1 || Renault, Renault GTA '87-'90 (UK market Alpine GTA), Mobilize Duo, Eagle Medallion made by Renault,<br> Opel/Vauxhall Arena made by Renault, Mitsubishi ASX, Colt, Grandis, & Eclipse Cross EV made by Renault
|-
| VF2 || Renault Trucks
|-
| VF3 || Peugeot
|-
| VF4 || Talbot
|-
| VF5 || Iveco Unic
|-
| VF6 || Renault Trucks including vans made by Renault S.A. & Maxity truck made by Nissan Motor Ibérica S.A.
|-
| VF7 || Citroën
|-
| VF8 || Matra Automobiles (Talbot-Matra Murena, Rancho made by Matra, Renault Espace I/II/III, Avantime made by Matra)
|-
| VF9/024 || Legras Industries (truck trailer)
|-
| VF9/045 || Nardeau SAS (truck trailer)
|-
| VF9/049 || G. Magyar (truck trailer)
|-
| VF9/063 || Maisonneuve (truck trailer)
|-
| VF9/132 || Jean CHEREAU S.A.S. (truck trailer)
|-
| VF9/300 || EvoBus France
|-
| VF9/435 || Merceron (truck trailer)
|-
| VF9/519 || Hommell
|-
| VF9/607 || Mathieu (sweeper)
|-
| VF9/673 || Venturi Automobiles
|-
| VF9/795 || [[../Bugatti/VIN Codes|Bugatti Automobiles S.A.S.]]
|-
| VF9/848 || G. Magyar (truck trailer)
|-
| VF9/880 || Bolloré Bluebus
|-
| VF9/938 || SAFRA (bus)
|-
| VGA || Peugeot Motocycles
|-
| VGT || ASCA (truck trailers)
|-
| VGU || Trouillet (truck trailers)
|-
| VGW || BSLT (truck trailers)
|-
| VGX || Coder (truck trailers)
|-
| VGY || Lohr (truck trailers)
|-
| VG5 || MBK (motorcycles) & Yamaha Motor
|-
| VG6 || Renault Trucks & Mack Trucks medium duty trucks made by Renault Trucks
|-
| VG7 || Renault Trucks
|-
| VG8 || Renault Trucks
|-
| VG9/019 || Naya (autonomous vehicle)
|-
| VG9/061 || Alstom-NTL Aptis (bus)
|-
| VHR || Robuste (truck trailer)
|-
| VHX || Manitowoc Cranes - Potain
|-
| VH1 || Benalu SAS (truck trailer)
|-
| VH8 || Microcar
|-
| VJR || Ligier
|-
| VJY || Gruau
|-
| VJ1 || Heuliez Bus
|-
| VJ2 || Mia Electric
|-
| VJ4 || Gruau
|-
| VKD || Cheval Liberté (horse trailer)
|-
| VK1 || SEG (truck trailer)
|-
| VK2 || Grandin Automobiles
|-
| VK8 || Venturi Automobiles
|-
| VLG || Aixam-Mega
|-
| VLU || Scania France
|-
| VL4 || Bluecar, Citroen E-Mehari
|-
| VMK || Renault Sport Spider
|-
| VMS || Automobiles Chatenet
|-
| VMT || SECMA
|-
| VMW || Gépébus Oréos 55
|-
| VM3 || Lamberet (trailer)
|-
| VM3 || Chereau (truck trailer)
|-
| VN1 || Renault SOVAB (France), Opel/Vauxhall Movano A made at SOVAB
|-
| VN4 || Voxan
|-
| VNB || Sherco Motorcycles SARL
|-
| VNE || Iveco Bus/Irisbus (France)
|-
| VNK || [[../Toyota/VIN Codes|Toyota]] Motor Manufacturing France & '11-'13 Daihatsu Charade (XP90) made by TMMF
|-
| VNV || Nissan made in France by Renault
|-
| VPG || MPM Motors
|-
| VPL || Nosmoke S.A.S
|-
| VP3 || G. Magyar (truck trailers)
|-
| VRW || Goupil
|-
| VR1 || DS Automobiles
|-
| VR3 || Peugeot (under Stellantis)
|-
| VR7 || Citroën (under Stellantis)
|-
| VSA || Mercedes-Benz Spain
|-
| VSC || Talbot
|-
| VSE || Santana Motors (Land Rover Series-based models) & Suzuki SJ/Samurai, Jimny, & Vitara made by Santana Motors in Spain
|-
| VSF || Santana Motors (Anibal/PS-10, 300/350)
|-
| VSK || Nissan Motor Iberica SA, Nissan passenger car/MPV/van/SUV/pickup & Ford Maverick 1993–1999
|-
| VSR || Leciñena (truck trailers)
|-
| VSS || SEAT/Cupra
|-
| VSX || Opel Spain
|-
| VSY || Renault V.I. Spain (bus)
|-
| VS1 || Pegaso
|-
| VS5 || Renault Spain
|-
| VS6 || [[../Ford/VIN Codes|Ford]] Spain
|-
| VS7 || Citroën Spain
|-
| VS8 || Peugeot Spain
|-
| VS9/001 || Setra Seida (Spain)
|-
| VS9/011 || Advanced Design Tramontana
|-
| VS9/013 || Mirofret (truck trailer) (Spain)
|-
| VS9/016 || Irizar bus (Spain)
|-
| VS9/019 || Cobos Hermanos (truck trailer) (Spain)
|-
| VS9/031 || Carrocerias Ayats (Spain)
|-
| VS9/032 || Parcisa (truck trailer) (Spain)
|-
| VS9/044 || Beulas bus (Spain) (Spain)
|-
| VS9/047 || Indox (truck trailers) (Spain)
|-
| VS9/052 || Montull (truck trailer) (Spain)
|-
| VS9/057 || SOR Ibérica (truck trailers) (Spain)
|-
| VS9/072 || Mecanicas Silva (truck trailer) (Spain)
|-
| VS9/098 || Sunsundegui bus (Spain)
|-
| VS9/172 || EvoBus Iberica
|-
| VS9/917 || Nogebus (Spain)
|-
| VTD || Montesa Honda (Honda Montesa motorcycle models)
|-
| VTH || Derbi (motorcycles)
|-
| VTL || Yamaha Spain (motorcycles)
|-
| VTM || Montesa Honda (Honda motorcycle models)
|-
| VTP || Rieju S.A. (motorcycles)
|-
| VTR || Gas Gas
|-
| VTT || Suzuki Spain (motorcycles)
|-
| VVC || SOR Ibérica (truck trailers)
|-
| VVG || Tisvol (truck trailers)
|-
| VV1 || Lecitrailer Group (truck trailers)
|-
| VV5 || Prim-Ball (truck trailers)
|-
| VV9/ || [[wikipedia:Tauro Sport Auto|TAURO]] Sport Auto Spain
|-
| VV9/010 || Castrosúa bus (Spain)
|-
| VV9/125 || Indetruck (truck trailers)
|-
| VV9/130 || Vectia Mobility bus (Spain)
|-
| VV9/130 || UNVI bus (Spain)
|-
| VV9/359|| Hispano-Suiza
|-
| VWA || Nissan Vehiculos Industriales SA, Nissan Commercial Vehicles
|-
| VWF || Guillén Group (truck trailers)
|-
| VWL || Indox (truck trailers)
|-
| VWV || Volkswagen Spain
|-
| VXE || Opel Automobile Gmbh/Vauxhall van
|-
| VXF || Fiat van (Fiat Scudo, Ulysse '22-)
|-
| VXK || Opel Automobile Gmbh/Vauxhall car/SUV
|-
| VXY || Neobus a.d. (Serbia)
|-
| VX1 || [[w:Zastava Automobiles|Zastava Automobiles]] / [[w:Yugo|Yugo]] (Yugoslavia/Serbia)
|-
| VYC || Lancia Ypsilon (4th gen.)
|-
| VYE || Jeep Compass (3rd gen. - EU market '26-)
|-
| VYF || Fiat Doblo '23- & Fiat Topolino '23- & Fiat Grande Panda '25-
|-
| VYJ || Ram 1200 '25- (sold in Mexico)
|-
| VYS || Renault & Alpine made by Ampere (Renault 5 E-Tech, Renault 4 E-Tech, Alpine A290)
|-
| VZ2 || Avtomontaža (bus) (Slovenia)
|-
| V1Y || FAS Sanos bus (Yugoslavia/North Macedonia)
|-
| V2X || Ikarbus a.d. (Serbia)
|-
| V31 || Tvornica Autobusa Zagreb (TAZ) (Croatia)
|-
| V34 || Crobus bus (Croatia)
|-
| V39/AB8 || Rimac Automobili (Croatia)
|-
| V39/CB3 || Eurobus (Croatia)
|-
| V39/WB4 || Rasco (machinery) (Croatia)
|-
| V6A || Bestnet AS; Tiki trailers (Estonia)
|-
| V6B || Brentex-Trailer (Estonia)
|-
| V6T || Verge Motorcycles (Estonia)
|-
| V61 || Respo Trailers (Estonia)
|-
| WAC || Arge Audi Porsche (Audi/Porsche RS2 Avant)
|-
| WAF || Ackermann (truck trailer)
|-
| WAG || Neoplan
|-
| WAP || Alpina
|-
| WAU || Audi car
|-
| WA1 || Audi SUV
|-
| WBA || BMW car
|-
| WBC || Boom Trikes
|-
| WBJ || Bitter Cars
|-
| WBK || Böcker Maschinenwerke GmbH
|-
| WBL || Blumhardt (truck trailers)
|-
| WBS || BMW M car
|-
| WBU || Bürstner (caravans)
|-
| WBX || BMW SUV
|-
| WBY || BMW i car
|-
| WB0 || Böckmann Fahrzeugwerke GmbH (trailers)
|-
| WB1 || BMW Motorrad
|-
| WB2 || Blyss (trailer)
|-
| WB3 || BMW Motorrad Motorcycles made in India by TVS
|-
| WB4 || BMW Motorrad Motorscooters made in China by Loncin
|-
| WB5 || BMW i SUV
|-
| WCD || Freightliner Sprinter "bus" (van with more than 3 rows of seats) 2008–2019
|-
| WCM || Wilcox (truck trailer)
|-
| WDA || Mercedes-Benz incomplete vehicle (North America)
|-
| WDB || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] & Maybach
|-
| WDC || Mercedes-Benz SUV
|-
| WDD || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] car
|-
| WDF || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] van/pickup (French & Spanish built models – Citan & Vito & X-Class)
|-
| WDP || Freightliner Sprinter incomplete vehicle 2005–2019
|-
| WDR || Freightliner Sprinter MPV (van with 2 or 3 rows of seats) 2005–2019
|-
| WDT || Dethleffs (caravans)
|-
| WDW || Dodge Sprinter "bus" (van with more than 3 rows of seats) 2008–2009
|-
| WDX || Dodge Sprinter incomplete vehicle 2005–2009
|-
| WDY || Freightliner Sprinter truck (cargo van with 1 row of seats) 2005–2019
|-
| WDZ || Mercedes-Benz "bus" (van with more than 3 rows of seats) (North America)
|-
| WD0 || Dodge Sprinter truck (cargo van with 1 row of seats) 2005–2009
|-
| WD1 || Freightliner Sprinter 2002 & Sprinter (Dodge or Freightliner) 2003–2005 incomplete vehicle
|-
| WD2 || Freightliner Sprinter 2002 & Sprinter (Dodge or Freightliner) 2003–2005 truck (cargo van with 1 row of seats)
|-
| WD3 || Mercedes-Benz truck (cargo van with 1 row of seats) (North America)
|-
| WD4 || Mercedes-Benz MPV (van with 2 or 3 rows of seats) (North America)
|-
| WD5 || Freightliner Sprinter 2002 & Sprinter (Dodge or Freightliner) 2003–2005 MPV (van with 2 or 3 rows of seats)
|-
| WD6 || Freightliner Unimog truck
|-
| WD7 || Freightliner Unimog incomplete vehicle
|-
| WD8 || Dodge Sprinter MPV (van with 2 or 3 rows of seats) 2005–2009
|-
| WEB || Evobus GmbH (Mercedes-Benz buses)
|-
| WEG || Ablinger (trailer)
|-
| WEL || e.GO Mobile AG
|-
| WFB || Feldbinder Spezialfahrzeugwerke GmbH
|-
| WFC || Fendt (caravans)
|-
| WFD || Fliegl Trailer
|-
| WFN || Tadano Faun GmbH
|-
| WF0 || [[../Ford/VIN Codes|Ford]] Germany
|-
| WF1 || Merkur
|-
| WGB || Göppel Bus GmbH
|-
| WG0 || Goldhofer AG (truck trailer)
|-
| WHB || Hobby - Wohnwagenwerk, Ing. H. Striewski GmbH (recreational vehicles)
|-
| WHD || Humbaur GmbH (truck trailer)
|-
| WHL || Hulco (trailer)
|-
| WHW || Hako GmbH
|-
| WHY || Hymer GmbH & Co. KG (recreational vehicles)
|-
| WH7 || Hüfferman (truck trailer)
|-
| WJM || Iveco/Iveco Magirus
|-
| WJR || Irmscher
|-
| WKE || Krone (truck trailers)
|-
| WKK || Setra (Evobus GmbH; formerly Kässbohrer)
|-
| WKN || Knaus, Weinsberg (caravans)
|-
| WKV || Kässbohrer Fahrzeugwerke Gmbh (truck trailers)
|-
| WK0 || Kögel (truck trailers)
|-
| WLA || Langendorf semi-trailers
|-
| WLF || Liebherr (mobile crane)
|-
| WMA || MAN Truck & Bus
|-
| WME || smart (from 5/99)
|-
| WMG || Demag Cranes
|-
| WMM || Karl Müller GmbH & Co. KG (truck trailers)
|-
| WMP || M & V GmbH (truck trailers)
|-
| WMU || Hako GmbH (Multicar)
|-
| WMW || MINI car
|-
| WMX || Mercedes-AMG used for Mercedes-Benz SLS AMG & Mercedes-AMG GT & Mercedes-AMG One (not used in North America)
|-
| WMZ || MINI SUV
|-
| WNA || Next.e.GO Mobile SE
|-
| WP0 || Porsche car
|-
| WP1 || Porsche SUV
|-
| WRA || Renders (truck trailers)
|-
| WRJ || Riese & Müller (bicycle)
|-
| WSE || STEMA Metalleichtbau GmbH (trailers)
|-
| WSJ || STERK Trailers (truck trailers)
|-
| WSK || Schmitz-Cargobull Gotha (truck trailers)
|-
| WSM || Schmitz-Cargobull (truck trailers)
|-
| WSP || Spitzer (truck trailers)
|-
| WSV || Aebi Schmidt Group
|-
| WS5 || StreetScooter
|-
| WS7 || Sono Motors
|-
| WTA || Tabbert (caravans)
|-
| WUA || Audi Sport GmbH (formerly quattro GmbH) car <br> (includes '04-'09 S4 Cabriolet & '06 S4 25quattro Special Edition sedan & '16-'18 S8 Plus & non-North American mkt. Q7 V12 TDI)
|-
| WU1 || Audi Sport GmbH (formerly quattro GmbH) SUV
|-
| WVG || Volkswagen SUV & Touran & N. American mkt. ID Buzz '25
|-
| WVM || Arbeitsgemeinschaft VW-MAN
|-
| WVP || Viseon Bus
|-
| WVW || Volkswagen passenger car, Sharan, Golf Plus, Golf Sportsvan
|-
| WV1 || Volkswagen Commercial Vehicles (cargo van or 1st gen. Amarok)
|-
| WV2 || Volkswagen Commercial Vehicles (passenger van or minibus)
|-
| WV3 || Volkswagen Commercial Vehicles (incomplete vehicle: chassis cab/cutaway)<br> [includes Winnebago Rialta ('97-'04), Winnebago Vista ('02-'04), Itasca Sunstar ('02-'04)]
|-
| WV4 || Volkswagen Commercial Vehicles (2nd gen. Amarok & T7 Transporter made by Ford)
|-
| WV5 || Volkswagen Commercial Vehicles (T7 Caravelle made by Ford)
|-
| WWA || Wachenhut (truck trailer)
|-
| WWC || WM Meyer (truck trailer)
|-
| WZ1 || Toyota Supra (Fifth generation for North America)
|-
| W0D || Obermaier (truck trailer)
|-
| W0L || Adam Opel AG/Vauxhall & Holden
|-
| W0L || Holden Zafira & Subaru Traviq made by GM Thailand
|-
| W0V || Opel Automobile Gmbh/Vauxhall & Holden (since 2017)
|-
| W04 || Buick Regal & Buick Cascada
|-
| W06 || Cadillac Catera
|-
| W08 || Saturn Astra
|-
| W09/A55 || Artega Automobile
|-
| W09/A71 || Apollo
|-
| W09/B09 || Bitter Cars
|-
| W09/B16 || Brabus
|-
| W09/B48 || Bultmann (trailer)
|-
| W09/B91 || Boerner (truck trailer)
|-
| W09/C09 || Carnehl Fahrzeugbau (truck trailer)
|-
| W09/D04 || DOLL (truck trailer)
|-
| W09/D05 || Drögmöller (bus)
|-
| W09/D17 || Dinkel (truck trailer)
|-
| W09/E04 || Eder (trailer)
|-
| W09/E27 || Esterer (truck trailer)
|-
| W09/E32 || ES-GE (truck trailer)
|-
| W09/E45 || Eurotank (truck trailer)
|-
| W09/F46 || FSN Fahrzeugbau (truck trailer)
|-
| W09/F57 || Twike
|-
| W09/G10 || GOFA (truck trailer)
|-
| W09/G64 || Gumpert
|-
| W09/H10 || Heitling Fahrzeugbau
|-
| W09/H21|| Dietrich Hisle GmbH (truck trailer)
|-
| W09/H46 || Hendricks (truck trailer)
|-
| W09/H49 || H&W Nutzfahrzeugtechnik GmbH (truck trailer)
|-
| W09/J02 || Isdera
|-
| W09/K27 || Krupp
|-
| W09/K27 || Kotschenreuther (truck trailer)
|-
| W09/L05 || Liebherr
|-
| W09/L06 || LMC Caravan (recreational vehicles)
|-
| W09/M08 || MEILLER Kipper (truck trailer)
|-
| W09/M09 || Meierling (truck trailer)
|-
| W09/M29 || MAFA (truck trailer)
|-
| W09/M40 || Franz Mersch (trailer)
|-
| W09/M79 || MKF Matallbau (truck trailer)
|-
| W09/N22 || NFP-Eurotrailer (truck trailer)
|-
| W09/P13 || Pagenkopf (truck trailer)
|-
| W09/P72 || De Tomaso Automobili (Capricorn)
|-
| W09/R06 || RUF
|-
| W09/R14 || Rancke (truck trailer)
|-
| W09/R27 || Gebr. Recker Fahrzeugbau (truck trailer)
|-
| W09/R30 || Reisch (truck trailer)
|-
| W09/R38 || Rewaco
|-
| W09/SG0 || Sileo (bus)
|-
| W09/SG1 || SEKA (truck trailer)
|-
| W09/S24 || Sommer (truck trailer)
|-
| W09/S25 || Spermann (truck trailer)
|-
| W09/S27 || Schröder (truck trailer)
|-
| W09/W11 || Wilken (truck trailer)
|-
| W09/W14 || Weka (truck trailer)
|-
| W09/W16 || Wellmeyer (truck trailer)
|-
| W09/W20 || Kurt Willig GmbH & Co. KG (truck trailer)
|-
| W09/W29 || Wiese (truck trailer)
|-
| W09/W35 || Wecon GmbH (truck trailer)
|-
| W09/W46 || WT-Metall (trailer)
|-
| W09/W59 || Wiesmann
|-
| W09/W70 || Wüllhorst (truck trailer)
|-
| W09/W86 || Web Trailer GmbH (truck trailer)
|-
| W09/004 || ORTEN Fahrzeugbau (truck trailer)
|-
| W1A || smart
|-
| W1H || Freightliner Econic
|-
| W1K || Mercedes-Benz car
|-
| W1N || Mercedes-Benz SUV
|-
| W1T || Mercedes-Benz truck
|-
| W1V || Mercedes-Benz van
|-
| W1W || Mercedes-Benz MPV (van with 2 or 3 rows of seats) (North America)
|-
| W1X || Mercedes-Benz incomplete vehicle (North America)
|-
| W1Y || Mercedes-Benz truck (cargo van with 1 row of seats) (North America)
|-
| W1Z || Mercedes-Benz "bus" (van with more than 3 rows of seats) (North America)
|-
| W2W || Freightliner Sprinter MPV (van with 2 or 3 rows of seats)
|-
| W2X || Freightliner Sprinter incomplete vehicle
|-
| W2Y || Freightliner Sprinter truck (cargo van with 1 row of seats)
|-
| W2Z || Freightliner Sprinter "bus" (van with more than 3 rows of seats)
|-
| XDN || Mercedes Sprinter Classic made by GAZ (Russia)
|-
| XD2 || CTTM Cargoline (truck trailer) (Russia)
|-
| XEA || AmberAvto (Avtotor) (Russia)
|-
| XE2 || AMKAR Automaster (truck trailer) (Russia)
|-
| XF9/B24 || NK Trailers (truck trailer) (Greece)
|-
| XF9/D44 || Militsis (trailer) (Greece)
|-
| XF9/J03 || Christos Nezis (truck trailer) (Greece)
|-
| XF9/J63 || Kaoussis (truck trailer) (Greece)
|-
| XG3 || Petros Petropoulos Group - Ecoshift NOOS electric motorscooters (Greece)
|-
| XG4|| Mpitis (trailer) (Greece)
|-
| XG5 || Stavropoulos trailers (Greece)
|-
| XG6 || MGK Hellenic Motor motorcycles (Greece)
|-
| XG8 || Gorgolis SA motorcycles (Greece)
|-
| XG9/B01 || Sfakianakis bus Greece
|-
| XG9/H33 || Rappas Trailer (Greece)
|-
| XG9/H51 || Eurotrailer Tourlakopoulos (trailer) (Greece)
|-
| XG9/H92 || Diamantis N. & Co. (trailer) (Greece)
|-
| XΗ9/B21 || Hellenic Vehicle Industry - ELVO bus Greece
|-
| XH9/H08 || Poseidonas Litsakis (trailer) (Greece)
|-
| XH9/H34 || Flexi-Wheels (trailer) (Greece)
|-
| XJY || Bonum (truck trailer) (Russia)
|-
| XJ4 || PKTS (PK Transportnye Sistemy) bus (Russia)
|-
| XKM || Volgabus (Russia)
|-
| XLA || DAF Bus International
|-
| XLB || Volvo Car B.V./NedCar B.V. (Volvo Cars)
|-
| XLC || [[../Ford/VIN Codes|Ford]] Netherlands
|-
| XLD || Pacton Trailers B.V.
|-
| XLE || Scania Netherlands
|-
| XLH || Hapert (trailer)
|-
| XLJ || Anssems (trailer)
|-
| XLK || Burg Trailer Service BV (truck trailer)
|-
| XLR || DAF Trucks & Leyland DAF
|-
| XLU || Henra (trailer)
|-
| XLV || DAF Bus
|-
| XLW || Terberg Benschop BV
|-
| XL3 || Ebusco
|-
| XL4 ||Lightyear
|-
| XL9/001 || ESVE BV (truck trailers)
|-
| XL9/002 || Jumbo Groenewegen (truck trailers)
|-
| XL9/003 || Autobusfabriek Bova BV
|-
| XL9/004 || G.S. Meppel (truck trailers)
|-
| XL9/007|| Broshuis BV (truck trailer)
|-
| XL9/010|| Ginaf Trucks
|-
| XL9/014 || Contar (truck trailer)
|-
| XL9/017 || Van Eck (truck trailer)
|-
| XL9/021 || Donkervoort Cars
|-
| XL9/033 || Wijer (trailer)
|-
| XL9/039 || Talson (truck trailer)
|-
| XL9/042 || Den Oudsten Bussen
|-
| XL9/052 || Witteveen (trailer)
|-
| XL9/055 || Fripaan (truck trailer)
|-
| XL9/067 || HTF (truck trailer)
|-
| XL9/068 || Vogelzang (truck trailer)
|-
| XL9/069 || Kraker (truck trailer)
|-
| XL9/070 || Veldhuizen (truck trailers)
|-
| XL9/073 || Zwalve (truck trailers)
|-
| XL9/074 || Draco (truck trailers)
|-
| XL9/081 || EBO van Weel (truck trailers)
|-
| XL9/084 || Vocol (truck trailers)
|-
| XL9/089 || Meijvo (trailers)
|-
| XL9/092 || Bulthuis (truck trailers)
|-
| XL9/103 || D-TEC (truck trailers)
|-
| XL9/109|| Groenewold Carrosseriefabriek B.V. (car transporter)
|-
| XL9/150 || Univan (truck trailer)
|-
| XL9/251 || Spierings Mobile Cranes
|-
| XL9/320 || VDL Bova bus
|-
| XL9/348 || HOKA (trailer)
|-
| XL9/355 || Berdex (truck trailer)
|-
| XL9/363 || Spyker
|-
| XL9/423 || Tijhof (trailer)
|-
| XL9/461 || BK Market Trailers (trailer)
|-
| XL9/495 || BE-Combi (truck trailer)
|-
| XL9/508 || Talson (truck trailer)
|-
| XL9/527 || GINAF
|-
| XL9/530 || Ebusco
|-
| XL9/611 || Zocon (trailer)
|-
| XMC || NedCar B.V. Mitsubishi Motors (LHD)
|-
| XMD || NedCar B.V. Mitsubishi Motors (RHD)
|-
| XMG || VDL Bus International
|-
| XMR || Nooteboom Trailers
|-
| XM4 || RAVO Holding B.V. (sweeper)
|-
| XNB || NedCar B.V. Mitsubishi Motors made by Pininfarina (Colt CZC convertible - RHD)
|-
| XNC || NedCar B.V. Mitsubishi Motors made by Pininfarina (Colt CZC convertible - LHD)
|-
| XNJ || Broshuis (truck trailer)
|-
| XNL || VDL Bus & Coach
|-
| XNT || Pacton Trailers B.V. (truck trailer)
|-
| XN1 || Kraker Trailers Axel B.V. (truck trailer)
|-
| XPN || Knapen Trailers
|-
| XPP || Atec Trailers
|-
| XP7 || Tesla Europe (based in the Netherlands) (Gigafactory Berlin-Brandenburg)
|-
| XRP || Proline (trailer)
|-
| XRY || D-TEC (truck trailer)
|-
| XR7 || Qarry
|-
| XTA || Lada / AvtoVAZ (Russia)
|-
| XTB || Moskvitch / AZLK (Russia)
|-
| XTC || KAMAZ (Russia)
|-
| XTD || LuAZ (Ukraine)
|-
| XTE || ZAZ (Ukraine)
|-
| XTF || GolAZ (Russia)
|-
| XTH || GAZ (Russia)
|-
| XTJ || Lada Oka made by SeAZ (Russia)
|-
| XTK || IzhAvto (Russia)
|-
| XTM || MAZ (Belarus); used until 1997
|-
| XTP || Ural (Russia)
|-
| XTS || ChMZAP (truck trailer)
|-
| XTT || UAZ / Sollers (Russia)
|-
| XTU || Trolza, previously ZiU (Russia)
|-
| XTW || LAZ (Ukraine)
|-
| XTY || LiAZ (Russia)
|-
| XTZ || ZiL (Russia)
|-
| XUF || General Motors Russia
|-
| XUS || Nizhegorodets (minibus) (Russia)
|-
| XUU || Avtotor (Russia, Chevrolet Korea SKD, Kaiyi Auto)
|-
| XUV || Avtotor (DFSK, SWM)
|-
| XUZ || InterPipeVAN (truck trailer)
|-
| XU6 || Avtodom (minibus) (Russia)
|-
| XVG || MARZ (bus) (Russia)
|-
| XVU || Start (truck trailer)
|-
| XWB || UZ-Daewoo/GM Uzbekistan/Ravon/UzAuto Motors (Uzbekistan)
|-
| XWD || Avtotor (Russia, BAIC SKD)
|-
| XWE || Avtotor (Russia, Hyundai-Kia SKD)
|-
| XWF || Avtotor (Russia, Chevrolet Tahoe/Opel/Cadillac/Hummer SKD)
|-
| XWK || Kia assembled in Russia by IzhAvto
|-
| XW7 || Toyota Motor Manufacturing Russia
|-
| XW8 || Volkswagen Group Russia (VW, Skoda)
|-
| XX3 || Ujet Manufacturing (Luxembourg)
|-
| XZB || SIMAZ (bus) (Russia)
|-
| XZE || Specpricep (truck trailer)
|-
| XZG || Great Wall Motor (Haval Motor Rus)
|-
| XZP || Gut Trailer (truck trailer)
|-
| XZT || FoxBus (minibus) (Russia)
|-
| X1D || RAF (Rīgas Autobusu Fabrika) (Latvia)
|-
| X1E || KAvZ (Russia)
|-
| X1F || NefAZ (Russia)
|-
| X1M || PAZ (Russia)
|-
| X1P || Ural (Russia)
|-
| X2L || Fox Trailer (truck trailer) (Russia)
|-
| X21 || Diesel-S (truck trailer) (Russia)
|-
| X4K || Volgabus (Volzhanin) (Russia)
|-
| X4T || Sommer (truck trailer) (Russia)
|-
| X4X || Avtotor (Russia, BMW SKD)
|-
| X5A || UralSpetzTrans (trailer) (Russia)
|-
| X6D || VIS-AVTO (Russia)
|-
| X6S || TZA (truck trailer) (Russia)
|-
| X7L || Renault AvtoFramos (1998-2014), Renault Russia (2014-2022), Moskvitch (2022-) (Russia)
|-
| X7M || [[../Hyundai/VIN Codes|Hyundai]] & Vortex (rebadged Chery) made by TagAZ (Russia)
|-
| X89/AD4 || ВМЗ (VMZ) bus
|-
| X89/BF8 || Rosvan bus
|-
| X89/CU2 || EvoBus Russland (bus)
|-
| X89/DJ2 || VMK (bus)
|-
| X89/EY4 || Brabill (minibus)
|-
| X89/FF6 || Lotos (bus)
|-
| X89/FY1 || Sherp
|-
| X8J || IMZ-Ural Ural Motorcycles
|-
| X8U || Scania Russia
|-
| X9F || Ford Motor Company ZAO
|-
| X9L || GM-AvtoVAZ (Chevrolet Niva & Viva)
|-
| X9N || Samoltor (minibus)
|-
| X9P || Volvo Vostok ZAO (Volvo Trucks)
|-
| X9W || Brilliance, Lifan made by Derways
|-
| X9X || Great Wall Motors
|-
| X96 || GAZ
|-
| X99/000 || Marussia
|-
| X90 || GRAZ (truck trailer)
|-
| X0T || Tonar (truck trailer)
|-
| YAF || Faymonville (special transport trailers)
|-
| YAG || Syma aanhangwagenbouw BV (trailers)
|-
| YAM || MAX Trailer (truck trailers)
|-
| YAR || Toyota Motor Europe (based in Belgium) used for Toyota ProAce, Toyota ProAce City and Toyota ProAce Max made by PSA/Stellantis
|-
| YA2 || Atlas Copco Group
|-
| YA5 || Renders (truck trailers)
|-
| YA9/ || Lambrecht Constructie NV (truck trailers)
|-
| YA9/111 || OVA (truck trailer)
|-
| YA9/121 || Atcomex (truck trailer)
|-
| YA9/128 || EOS (bus)
|-
| YA9/139 || ATM Maaseik (truck trailer)
|-
| YA9/168 || Forthomme s.a. (truck trailer)
|-
| YA9/169 || Automobiles Gillet
|-
| YA9/180 || EOS (bus)
|-
| YA9/191 || Stokota (truck trailers)
|-
| YA9/195 || Denolf & Depla (minibus)
|-
| YBC || Toyota Supra (Fifth generation for Europe)
|-
| YBD || Addax Motors
|-
| YBW || Volkswagen Belgium
|-
| YB1 || Volvo Trucks Belgium (truck)
|-
| YB2 || Volvo Trucks Belgium (bus chassis)
|-
| YB3 || Volvo Trucks Belgium (incomplete vehicle)
|-
| YB4 || LAG Trailers N.V. (truck trailer)
|-
| YB6 || Jonckheere (VDL Belgium)
|-
| YCM || Mazda Motor Logistics Europe (based in Belgium) used for European-market Mazda 121 made by Ford in UK
|-
| YC1 || Honda Belgium NV (motorcycle)
|-
| YC3 || Eduard Trailers
|-
| YD3 || Chateau Caravans (Belgium)
|-
| YE1 || Van Hool (trailers) (Belgium)
|-
| YE2 || Van Hool (buses) (Belgium)
|-
| YE6 || STAS (truck trailer)
|-
| YE7 || Turbo's Hoet (truck trailer)
|-
| YF1 || Närko (truck trailer) (Finland)
|-
| YF3 || NTM (truck trailer) (Finland)
|-
| YF9/050 || JYKI (truck trailer) (Finland)
|-
| YGU || JJ-Trailer (trailer) (Finland)
|-
|YG6
|Majava Group Oy; Majava trailers (Finland)
|-
| YH1 || Solifer (caravans)
|-
| YH2 || BRP Finland (Lynx snowmobiles)
|-
| YH4 || Fisker Automotive (Fisker Karma) built by Valmet Automotive
|-
| YK1 || Saab-Valmet Finland
|-
| YK2, YK7 || Sisu Auto
|-
| YK9/003 || Kabus (bus)
|-
| YK9/008 || Lahden Autokori (-2013), SOE Busproduction Finland (2014-2024) (bus)
|-
| YK9/016 || Linkker (bus)
|-
| YSC || Cadillac BLS (made by Saab)
|-
| YSM || Polestar cars
|-
| YSP || Volta Trucks AB
|-
| YSR || Polestar SUV
|-
| YS2 || Scania commercial vehicles (Södertälje factory)
|-
| YS3 || Saab cars
|-
| YS4 || Scania buses and bus chassis until 2002 (Katrineholm factory)
|-
| YS5 || OmniNova (minibus)
|-
| YS7 || Solifer (recreational vehicles)
|-
| YS9/KV1 || Backaryd (minibus)
|-
| YTN || Saab made by NEVS
|-
| YT7 || Kabe (recreational vehicles)
|-
| YT9/007 || Koenigsegg
|-
| YT9/034 || Carvia
|-
| YU1 || Fogelsta, Brenderup Group (trailer)
|-
| YU7 || Husaberg (motorcycles)
|-
| YVV || WiMa 442 EV
|-
| YV1 || [[../Volvo/VIN Codes|Volvo]] cars
|-
| YV2 || [[../Volvo/VIN Codes|Volvo]] trucks
|-
| YV3 || [[../Volvo/VIN Codes|Volvo]] buses and bus chassis
|-
| YV4 || [[../Volvo/VIN Codes|Volvo]] SUV
|-
| YV5 || [[../Volvo/VIN Codes|Volvo Trucks]] incomplete vehicle
|-
| YYB || Tysse (trailer) (Norway)
|-
| YYC || Think Nordic (Norway)
|-
| YY9/017 || Skala Fabrikk (truck trailer) (Norway)
|-
| Y29/005 || Buddy Electric (Norway)
|-
| Y3D || MTM (truck trailer) (Belarus)
|-
| Y3F || Lida Buses Neman (Belarus)
|-
| Y3J || Belkommunmash (Belarus)
|-
| Y3K || Neman Bus (Belarus)
|-
| Y3M || MAZ (Belarus)
|-
| Y3W || VFV built by Unison (Belarus)
|-
| Y39/047 || Altant-M (minibus) (Belarus)
|-
| Y39/051 || Bus-Master (minibus) (Belarus)
|-
| Y39/052 || Aktriya (minibus) (Belarus)
|-
| Y39/072 || Klassikbus (minibus) (Belarus)
|-
| Y39/074 || Alterra (minibus) (Belarus)
|-
| Y39/135 || EuroDjet (minibus) (Belarus)
|-
| Y39/240 || Alizana (minibus) (Belarus)
|-
| Y39/241 || RSBUS (minibus) (Belarus)
|-
| Y39/323 || KF-AVTO (minibus) (Belarus)
|-
| Y4F || [[../Ford/VIN Codes|Ford]] Belarus
|-
| Y4K || Geely / BelGee (Belarus)
|-
| Y6B || Iveco (Ukraine)
|-
| Y6D || ZAZ / AvtoZAZ, Chevrolet Lanos made by ZAZ (Ukraine)
|-
| Y6E || LAZ (Ukraine)
|-
| Y6J || Bogdan group (Ukraine)
|-
| Y6L || Bogdan group including buses, Lada, & Hyundai made by Bogdan (Ukraine)
|-
| Y6U || Škoda Auto made by Eurocar (Ukraine)
|-
| Y6W || PGFM (trailer) (Ukraine)
|-
| Y6Y || LEV (trailer) (Ukraine)
|-
| Y69/B19 || Stryi Avto (bus) (Ukraine)
|-
| Y69/B98 || VESTT (truck trailer) (Ukraine)
|-
| Y69/C49 || TAD (truck trailer) (Ukraine)
|-
| Y69/D75 || Barrel Dash (truck trailer) (Ukraine)
|-
| Y7A || KrAZ trucks (Ukraine)
|-
| Y7B || Bogdan group (Ukraine)
|-
| Y7C || Great Wall Motors, Geely made by KrASZ (Ukraine)
|-
| Y7D || GAZ made by KrymAvtoGAZ (Ukraine)
|-
| Y7F || Boryspil Bus Factory (BAZ) (Ukraine)
|-
| Y7S || Korida-Tech (trailer) (Ukraine)
|-
| Y7W || Geely made by KrASZ (Ukraine)
|-
| Y7X || ChRZ - Ruta (minibus) (Ukraine)
|-
| Y79/A23 || OdAZ (truck trailer) (Ukraine)
|-
| Y79/B21 || Everlast (truck trailer) (Ukraine)
|-
| Y79/B65 || Avtoban (trailer) (Ukraine)
|-
| Y8A || LAZ (Ukraine)
|-
| Y8H || UNV Leader (trailer) (Ukraine)
|-
| Y8S || Alekseevka Ximmash (truck trailer)
|-
| Y8X || GAZ Gazelle made by KrASZ (Ukraine)
|-
| Y89/A98 || VARZ (trailer) (Ukraine)
|-
| Y89/B75 || Knott (trailer) (Ukraine)
|-
| Y89/C65 || Electron (Ukraine)
|-
| Y9A || PAVAM (trailer) (Ukraine)
|-
| Y9H || LAZ (Ukraine)
|-
| Y9M || AMS (trailer) (Ukraine)
|-
| Y9T || Dnipro (trailer) (Ukraine)
|-
| Y9W || Pragmatec (trailer) (Ukraine)
|-
| Y9Z || Lada, Renault made in Ukraine
|-
| Y99/B32 || Santey (trailer) (Ukraine)
|-
| Y99/E21 || Zmiev-Trans (truck trailer) (Ukraine)
|-
| Y99/C79 || Electron (bus) (Ukraine)
|-
| ZAA || Autobianchi
|-
| ZAA || Alfa Romeo Junior 2024-
|-
| ZAC || Jeep, Dodge Hornet
|-
| ZAH || Rolfo SpA (car transporter)
|-
| ZAJ || Trigano SpA; Roller Team recreational vehicles
|-
| ZAM || [[../Maserati/VIN Codes|Maserati]]
|-
| ZAP || Piaggio/Vespa/Gilera
|-
| ZAR || Alfa Romeo car
|-
| ZAS || Alfa Romeo Alfasud & Sprint through 1989
|-
| ZAS || Alfa Romeo SUV 2018-
|-
| ZAX || Zorzi (truck trailer)
|-
| ZA4 || Omar (truck trailer)
|-
| ZA9/A12 || [[../Lamborghini/VIN Codes|Lamborghini]] through mid-2003 (including LM002)
|-
| ZA9/A17 || Carrozzeria Luigi Dalla Via (bus)
|-
| ZA9/A18 || De Simon (bus)
|-
| ZA9/A33 || Bucher Schörling Italia (sweeper)
|-
| ZA9/A47 || Silver Car (truck trailer)
|-
| ZA9/B09 || Mauri Bus System
|-
| ZA9/B34 || Mistrall Siloveicoli (truck trailer)
|-
| ZA9/B45 || Bolgan (truck trailer)
|-
| ZA9/B49 || OMSP Macola (truck trailer)
|-
| ZA9/B95 || Carrozzeria Autodromo Modena (bus)
|-
| ZA9/C38 || Dulevo (sweeper)
|-
| ZA9/D38 || Cizeta Automobili SRL
|-
| ZA9/D39 || [[../Bugatti/VIN Codes|Bugatti Automobili S.p.A]]
|-
| ZA9/D50 || Italdesign Giugiaro
|-
| ZA9/E15 || Tecnobus Industries S.r.l.
|-
| ZA9/E73 || Sitcar (bus)
|-
| ZA9/E88 || Cacciamali (bus)
|-
| ZA9/F16 || OMT (truck trailer)
|-
| ZA9/F21 || FGM (truck trailer)
|-
| ZA9/F48 || Rampini Carlo S.p.A. (bus)
|-
| ZA9/F76 || Pagani Automobili S.p.A.
|-
| ZA9/G97 || EPT Horus (bus)
|-
| ZA9/H02 || O.ME.P.S. (truck trailer)
|-
| ZA9/H44|| Green-technik by Green Produzione s.r.l. (machine trailer)
|-
| ZA9/J21 || VRV (truck trailer)
|-
| ZA9/J93 || Barbi (bus)
|-
| ZA9/K98 || Esagono Energia S.r.l.
|-
| ZA9/M09 || Italdesign Automobili Speciali
|-
| ZA9/M27 || Dallara Stradale
|-
| ZA9/M91 || Automobili Pininfarina
|-
| ZA9/180 || De Simon (bus)
|-
| ZA0 || Acerbi (truck trailer)
|-
| ZBA || Piacenza (truck trailer)
|-
| ZBB || Bertone
|-
| ZBD || InBus
|-
| ZBN || Benelli
|-
| ZBW || Rayton-Fissore Magnum
|-
| ZB3 || Cardi (truck trailer)
|-
| ZCB || E. Bartoletti SpA (truck trailer)
|-
| ZCF || Iveco / Irisbus (Italy)
|-
| ZCG || Cagiva SpA / MV Agusta
|-
| ZCG || Husqvarna Motorcycles Under MV Agusta ownership
|-
| ZCM || BredaMenarinibus / Menarinibus / IIA (Industria Italiana Autobus)
|-
| ZCN || Astra Veicoli Industriali S.p.A.
|-
| ZCV || Vibreti (truck trailer)
|-
| ZCZ || BredaBus
|-
| ZC1 || AnsaldoBreda S.p.A.
|-
| ZC2 || Chrysler TC by Maserati
|-
| ZDC || Honda Italia Industriale SpA
|-
| ZDF || [[../Ferrari/VIN Codes|Ferrari]] Dino
|-
| ZDJ || ACM Biagini
|-
| ZDM || Ducati Motor Holdings SpA
|-
| ZDT || De Tomaso Modena SpA
|-
| ZDY || Cacciamali
|-
| ZD0 || Yamaha Motor Italia SpA & Belgarda SpA
|-
| ZD3 || Beta Motor
|-
| ZD4 || Aprilia
|-
| ZD5 || Casalini
|-
| ZEB || Ellebi (trailer)
|-
| ZEH || Trigano SpA (former SEA Group); McLouis & Mobilvetta recreational vehicles
|-
| ZES || Bimota
|-
| ZEX || TM Racing (motorcycle)
|-
| ZE5 || Carmosino (truck trailer)
|-
| ZFA || Fiat
|-
| ZFB || Fiat MPV/SUV & Ram Promaster City
|-
| ZFC || Fiat truck (Fiat Ducato for Mexico, Ram 1200)
|-
| ZFE || KL Motorcycle
|-
| ZFF || [[../Ferrari/VIN Codes|Ferrari]]
|-
| ZFJ || Carrozzeria Pezzaioli (truck trailer)
|-
| ZFM || Fantic Motor
|-
| ZFR || Pininfarina
|-
| ZF4 || Qvale
|-
| ZGA || Iveco Bus
|-
| ZGP || Merker (truck trailer)
|-
| ZGU || Moto Guzzi
|-
| ZG2 || FAAM (commercial vehicle)
|-
| ZHU || Husqvarna Motorcycles Under Cagiva ownership
|-
| ZHW || [[../Lamborghini/VIN Codes|Lamborghini]] (Mid-2003 – )
|-
| ZHZ || Menci SpA (truck trailer)
|-
| ZH5 || FB Mondial (motorcycle)
|-
| ZJM || Malaguti
|-
| ZJN || Innocenti
|-
| ZJT || Italjet
|-
| ZKC || Ducati Energia Free Duck (electric quadricycle)
|-
| ZKH || Husqvarna Motorcycles Srl Under BMW ownership
|-
| ZLA || Lancia
|-
| ZLF || Tazzari GL SpA
|-
| ZLM || Moto Morini srl
|-
| ZLV || Laverda
|-
| ZNN || Energica
|-
| ZN0 || SWM Motorcycles S.r.l.
|-
| ZN3 || Iveco Defence
|-
| ZN6 || Maserati SUV
|-
| ZPB || [[../Lamborghini/VIN Codes|Lamborghini]] SUV
|-
| ZPY || DR Automobiles
|-
| ZP6 || XEV
|-
| ZP8 || Regis Motors
|-
| ZRG || Tazzari GL Imola SpA
|-
| ZR1 || Microlino
|-
| ZSG || [[../Ferrari/VIN Codes|Ferrari]] SUV
|-
| ZX1 || TAM (Tovarna Avtomobilov Maribor) bus (Slovenia)
|-
| ZX9/KU0 || K-Bus / Kutsenits (bus) (Slovenia)
|-
| ZX9/DUR || TAM bus (Slovenia)
|-
| ZX9/TV0 || TAM (Tovarna Vozil Maribor) bus (Slovenia)
|-
| ZY1 || Adria (recreational vehicles) (Slovenia)
|-
| ZY9/002 || Gorica (truck trailer) (Slovenia)
|-
| ZZ1 || Tomos motorcycle (Slovenia)
|-
| Z29/555 || Vozila FLuid (truck trailer) (Slovenia)
|-
| Z3D || Tauriga UAB; Tauras trailers (Lithuania)
|-
| Z39/008 || Autogalantas (truck trailer) (Lithuania)
|-
| Z39/009 || Patikima Linija / Rimo (truck trailer) (Lithuania)
|-
| Z6F || Ford Sollers (Russia)
|-
| Z7C || Luidor (bus) (Russia)
|-
| Z7N || KAvZ (bus) (Russia)
|-
| Z7T || RoAZ (bus) (Russia)
|-
| Z7X || Isuzu Rus (Russia)
|-
| Z76 || SEMAZ (Kazakhstan)
|-
| Z8M || Marussia (Russia)
|-
| Z8N || Nissan Manufacturing Rus & Nissan and Datsun models made by AvtoVAZ (Russia)
|-
| Z8P || IRITO
|-
| Z8T || PCMA Rus (Peugeot, Citroen, Mitsubishi) (Russia)
|-
| Z8U || [[w:SsangYong Korando#Third generation (C200; 2010)|Ssangyong Actyon]] made by Sollers (Russia)
|-
| Z8Y || Nasteviya (bus) (Russia)
|-
| Z9B || KuzbassAvto (Hyundai bus) (Russia)
|-
| Z9M || Mercedes-Benz Manufacturing Rus / Mercedes-Benz Trucks Vostok (Russia)
|-
| Z9N || Samotlor-NN (Iveco) (Russia)
|-
| Z94 || Hyundai Motor Manufacturing Rus (Hyundai, Kia) (2008-2023), Solaris Auto - AGR Automotive (2023-) (Russia)
|-
| Z07 || Volgabus (Russia)
|-
| 1A4 1A8 || Chrysler brand MPV/SUV 2006–2009 only
|-
| 1A9/007 || Advance Mixer Inc.
|-
| 1A9/111 || Amerisport Inc. (federalized late model DeTomaso Pantera)
|-
| 1A9/398 || Ameritech (federalized McLaren F1 & Bugatti EB110)
|-
| 1A9/569 || American Custom Golf Cars Inc. (AGC)
|-
| 1AC || American Motors Corporation MPV
|-
| 1AF || American LaFrance truck
|-
| 1AJ || Ajax Manufacturing (truck trailer)
|-
| 1AM || American Motors Corporation car & Renault Alliance 1983 only
|-
| 1BN || Beall Trailers (truck trailer)
|-
| 1B3 || Dodge car 1981–2011
|-
| 1B4 || Dodge MPV/SUV 1981–2002
|-
| 1B6 || Dodge incomplete vehicle 1981–2002
|-
| 1B7 || Dodge truck 1981–2002
|-
| 1B9/133 || Buell Motorcycle Company through mid-1995
|-
| 1B9/274 || Brooks Brothers Trailers
|-
| 1B9/275 || Boydstun Metal Works (truck trailer)
|-
| 1B9/285 || Boss Hoss Cycles
|-
| 1B9/374 || Big Dog Custom Motorcycles through mid-2002
|-
| 1B9/975 || Motus Motorcycles
|-
| 1BA || Blue Bird Corporation bus
|-
| 1BB || Blue Bird Wanderlodge MPV
|-
| 1BD || Blue Bird Corporation incomplete vehicle
|-
| 1BL || Balko, Inc.
|-
| 1C3 || Chrysler brand car 1981–2011
|-
| 1C3 || Chrysler Group (all brands) car (including Lancia) 2012-
|-
| 1C4 || Chrysler brand MPV 1990–2005
|-
| 1C4 || Chrysler Group (all brands) MPV 2012–
|-
| 1C6 || Chrysler Group (all brands) truck 2012–
|-
| 1C8 || Chrysler brand MPV 2001–2005
|-
| 1C9/257 || CEI Equipment Company (truck trailer)
|-
| 1C9/291 || CX Automotive
|-
| 1C9/496 || Carlinville Truck Equipment (truck trailer)
|-
| 1C9/535 || Chance Coach (bus)
|-
| 1C9/737 || Corbin Motors, Inc.
|-
| 1C9/772 || Cozad (truck trailer)
|-
| 1C9/971 || Cool Amphibious Manufacturers International
|-
| 1CM || Checker Motors Corporation
|-
| 1CU || Cushman Haulster (Cushman division of Outboard Marine Corporation)
|-
| 1CY || Crane Carrier Company
|-
| 1CY || Battle Motors, Inc.
|-
| 1D3 || Dodge truck 2002–2009
|-
| 1D4 || Dodge MPV/SUV 2003–2011 only
|-
| 1D7 || Dodge truck 2002–2011
|-
| 1D8 || Dodge MPV/SUV 2003–2009 only
|-
| 1D9/008 || KME Fire Apparatus
|-
| 1D9/628 || Dymac Vehicle Group (low-speed vehicle)
|-
| 1D9/791 || Dennis Eagle, Inc.
|-
| 1DW || Stoughton Trailers (truck trailer)
|-
| 1E9/007 || E.D. Etnyre & Co. (truck trailer)
|-
| 1E9/190 || Electric Transit Inc. (trolleybus)
|-
| 1E9/363 || E-SUV LLC (E-Ride Industries)
|-
| 1E9/456 || Electric Motorsport (GPR-S electric motorcycle)
|-
| 1E9/526 || Epic TORQ
|-
| 1E9/581 || Vetter Razor
|-
| 1EU || Eagle Coach Corporation (bus)
|-
| 1FA || [[../Ford/VIN Codes|Ford]] car
|-
| 1FB || [[../Ford/VIN Codes|Ford]] "bus" (van with more than 3 rows of seats)
|-
| 1FC || [[../Ford/VIN Codes|Ford]] stripped chassis made by Ford
|-
| 1FD || [[../Ford/VIN Codes|Ford]] incomplete vehicle
|-
| 1FM || [[../Ford/VIN Codes|Ford]] MPV/SUV
|-
| 1FT || [[../Ford/VIN Codes|Ford]] truck
|-
| 1FU || Freightliner (truck)
|-
| 1FV || Freightliner (incomplete vehicle)
|-
| 1F1 || Ford SUV - Limousine (through 2009)
|-
| 1F6 || Ford stripped chassis made by Detroit Chassis LLC
|-
| 1F9/037 || Federal Motors Inc.
|-
| 1F9/140 || Ferrara Fire Apparatus (incomplete vehicle)
|-
| 1F9/458 || Faraday Future prototypes
|-
| 1F9/FT1 || FWD Corp.
|-
| 1F9/ST1 || Seagrave Fire Apparatus
|-
| 1F9/ST2 || Seagrave Fire Apparatus
|-
| 1G || [[../GM/VIN Codes|General Motors]] USA
|-
| 1G0 || GMC "bus" (van with more than 3 rows of seats) 1981–1986
|-
| 1G0 || GMC Rapid Transit Series (RTS) bus 1981–1984
|-
| 1G0 || Opel/Vauxhall car 2007–2017
|-
| 1G1 || [[../GM/VIN Codes|Chevrolet]] car
|-
| 1G2 || [[../GM/VIN Codes|Pontiac]] car
|-
| 1G3 || [[../GM/VIN Codes|Oldsmobile]] car
|-
| 1G4 || [[../GM/VIN Codes|Buick]] car
|-
| 1G5 || GMC MPV/SUV 1981–1986
|-
| 1G5 || Pontiac incomplete vehicle 1989-1990, 2003-2006
|-
| 1G6 || [[../GM/VIN Codes|Cadillac]] car
|-
| 1G7 || Pontiac car only sold by GM Canada
|-
| 1G8 || Chevrolet MPV/SUV 1981–1986
|-
| 1G8 || [[../GM/VIN Codes|Saturn]] car 1991–2010
|-
| 1G9/492 || GreenPower Motor Company incomplete vehicle
|-
| 1G9/495 || Google & Waymo
|-
| 1GA || Chevrolet "bus" (van with more than 3 rows of seats)
|-
| 1GB || Chevrolet incomplete vehicle
|-
| 1GC || [[../GM/VIN Codes|Chevrolet]] truck
|-
| 1GD || GMC incomplete vehicle
|-
| 1GE || Cadillac incomplete vehicle
|-
| 1GF || Flxible bus
|-
| 1GG || Isuzu pickup trucks made by GM
|-
| 1GH || GMC Rapid Transit Series (RTS) bus 1985–1986
|-
| 1GH || Oldsmobile MPV/SUV 1990–2004
|-
| 1GH || Holden Acadia 2019–2020
|-
| 1GJ || GMC "bus" (van with more than 3 rows of seats) 1987–
|-
| 1GK || GMC MPV/SUV 1987–
|-
| 1GM || [[../GM/VIN Codes|Pontiac]] MPV
|-
| 1GN || [[../GM/VIN Codes|Chevrolet]] MPV/SUV 1987-
|-
| 1GR || Great Dane Trailers (truck trailer)
|-
| 1GT || [[../GM/VIN Codes|GMC]] Truck
|-
| 1GW || Grumman Olson Kubvan (truck)
|-
| 1GY || [[../GM/VIN Codes|Cadillac]] SUV
|-
| 1HA || Chevrolet incomplete vehicles (Express cutaway) made by Navistar International/International Motors
|-
| 1HD || Harley-Davidson & LiveWire
|-
| 1HF || Honda motorcycle/ATV/UTV
|-
| 1HG || [[../Honda/VIN Codes|Honda]] car made by Honda of America Mfg. in Ohio
|-
| 1HP || International Trucks (complete vehicle - straight truck)
|-
| 1HS || International Trucks & Caterpillar Trucks (complete vehicle - truck tractor)
|-
| 1HT || International Trucks & Caterpillar Trucks & Chevrolet Silverado 4500HD, 5500HD, 6500HD (incomplete vehicle - straight truck)
|-
| 1HV || International or IC Bus (incomplete vehicle - bus)
|-
| 1H9/484 || Hughes Trailers (Based in Canyon, TX) (trailer)
|-
| 1H9/674 || Hines Specialty Vehicle Group
|-
| 1JC || Jeep SUV 1981–1988 (using AMC-style VIN structure)
|-
| 1JJ || Wabash (truck trailer)
|-
| 1JT || Jeep truck 1981–1988 (using AMC-style VIN structure)
|-
| 1JU || Marmon Motor Company (truck)
|-
| 1J4 || Jeep SUV 1989–2011 (using Chrysler-style VIN structure)
|-
| 1J7 || Jeep truck 1989–1992 (using Chrysler-style VIN structure)
|-
| 1J8 || Jeep SUV 2002–2011 (using Chrysler-style VIN structure)
|-
| 1KB || Holiday Rambler Corp. 1981-2010 (trailer)
|-
| 1K9/058 || Kovatech Mobile Equipment (fire engine)
|-
| 1LH || Landoll (truck trailer)
|-
| 1LJ || Lincoln incomplete vehicle
|-
| 1LN || [[../Ford/VIN Codes|Lincoln]] car
|-
| 1LV || Lectra Motors
|-
| 1L0 || Lufkin Trailers
|-
| 1L1 || Lincoln car – limousine
|-
| 1L9/155 || LA Exotics
|-
| 1L9/234 || Laforza
|-
| 1MB || Mercedes-Benz Truck Co.
|-
| 1ME || [[../Ford/VIN Codes|Mercury]] car
|-
| 1MR || Continental Mark VI & VII 1981–1985 & Continental sedan 1982–1985
|-
| 1M0 || John Deere Gator
|-
| 1M1 || Mack Truck USA (truck)
|-
| 1M2 || Mack Truck USA (incomplete vehicle)
|-
| 1M3 || Mack Truck USA (glider)
|-
| 1M8 || Motor Coach Industries (bus)
|-
| 1M9/089 || Mauck Special Vehicles (bus)
|-
| 1M9/682 || Mosler Automotive
|-
| 1M9/816 || Proterra Through mid-2019
|-
| 1N4 || Nissan car
|-
| 1N6 || Nissan truck
|-
| 1N9/019 || Neoplan USA
|-
| 1N9/084 || Eldorado National (California)
|-
| 1N9/140 || North American Bus Industries (bus)
|-
| 1N9/393 || Nikola Corporation (truck)
|-
| 1NK || Kenworth (incomplete vehicle)
|-
| 1NL || Gulf Stream Coach (recreational vehicles)
|-
| 1NN || Monon made by Evans Products Co. (truck trailer)
|-
| 1NP || Peterbilt (incomplete vehicle)
|-
| 1NX || Toyota car made by NUMMI
|-
| 1P3 || Plymouth car
|-
| 1P4 || Plymouth MPV/SUV
|-
| 1P7 || Plymouth Scamp
|-
| 1P9/038 || Hawk Vehicles, Inc. (Trihawk motorcycles)
|-
| 1P9/213 || Panoz
|-
| 1P9/255 || Pinson Truck Equipment Company (truck trailer)
|-
| 1PM || Polar Tank Trailer (truck trailer)
|-
| 1PT || Trailmobile Trailer Corporation (truck trailer)
|-
| 1PY || John Deere USA
|-
| 1RF || Roadmaster, Monaco Coach Corporation (incomplete vehicle)
|-
| 1RN || Reitnouer (truck trailer)
|-
| 1R9/956 || Reede Fabrication and Design (motorcycles)
|-
| 1ST || Airstream (recreational vehicles)
|-
| 1S1 || Strick Trailers (truck trailer)
|-
| 1S9/003 || Sutphen Corporation (fire engines - truck)
|-
| 1S9/009|| Superior Trailer Works (truck trailer)
|-
| 1S9/098 || Scania AB (Scania CN112 bus made in Orange, CT)
|-
| 1S9/842 || Saleen S7
|-
| 1S9/260 || Stairs Welding RL (truck trailer)
|-
| 1S9/901 || Suckerpunch Sallys, LLC
|-
| 1S9/944 || SSC North America
|-
| 1TD || Timpte (truck trailer)
|-
| 1TK || Trail King (truck trailer)
|-
| 1TD || Transcraft Corporation (truck trailer)
|-
| 1T7 || Thomas Built Buses
|-
| 1T8 || Thomas Built Buses
|-
| 1T9/072 || The Trailer Co. (truck trailer)
|-
| 1T9/717 || Thunder Mountain Custom Cycles
|-
| 1T9/825 || TICO Manufacturing Company (truck)
|-
| 1T9/899 || Tomcar USA
|-
| 1T9/970 || Three Two Chopper
|-
| 1TC || Coachmen Recreational Vehicle Co., LLC
|-
| 1TU || Transportation Manufacturing Corporation
|-
| 1UJ || Jayco, Inc.
|-
| 1UT || AM General military trucks, Jeep DJ made by AM General
|-
| 1UY || Utility Trailer (truck trailer)
|-
| 1VH || Orion Bus Industries
|-
| 1VW || Volkswagen car
|-
| 1V1 || Volkswagen truck
|-
| 1V2 || Volkswagen SUV
|-
| 1V9/048 || Vector Aeromotive
|-
| 1V9/113 || Vantage Vehicle International Inc (low-speed vehicle)
|-
| 1V9/190 || Vanderhall Motor Works
|-
| 1WA || White Motor Company (Autocar brand truck)
|-
| 1WB || White Motor Company (Autocar brand incomplete vehicle)
|-
| 1WD || White Motor Company (Autocar brand glider)
|-
| 1WT || Winnebago Industries: Winnebago M.P.V.
|-
| 1WU || White Motor Company (White brand truck)
|-
| 1WV || Winnebago Industries: Winnebago M.P.V. - Class C Motorhome built on VW chassis & front cab [Winnebago Rialta ('95-'96)]
|-
| 1WW || Winnebago Industries: Winnebago M.P.V. - Class B Motorhome built on Renault chassis [Winnebago LeSharo, Centauri, Itasca Phasar]
|-
| 1WX || White Motor Company (White brand incomplete vehicle)
|-
| 1WY || White Motor Company (White brand glider)
|-
| 1W1 || Wilson Trailer Co. (truck trailer)
|-
| 1W5 || Western Recreational Vehicles (Alpenlite)
|-
| 1W8 || Witzco (truck trailer)
|-
| 1W9/010 || Weld-It Company (truck trailer)
|-
| 1W9/485 || Wheego Electric Cars
|-
| 1W9/488 || Certified Stainless Services Inc. DBA West-Mark (truck trailer) (2010 & later)
|-
| 1XA || Excalibur Automobile Corporation
|-
| 1XK || Kenworth (truck)
|-
| 1XM || Renault Alliance/GTA/Encore 1984–1987
|-
| 1XP || Peterbilt (truck)
|-
| 1Y1 || Chevrolet/Geo car made by NUMMI
|-
| 1YJ || Rokon International, Inc.
|-
| 1YV || [[../Ford/VIN Codes|Mazda made by Mazda Motor Manufacturing USA/AutoAlliance International]]
|-
| 1ZV || [[../Ford/VIN Codes|Ford made by Mazda Motor Manufacturing USA/AutoAlliance International]]
|-
| 1ZW || [[../Ford/VIN Codes|Mercury made by AutoAlliance International]]
|-
| 1Z3 1Z7 || Mitsubishi Raider
|-
| 1Z9/170 || [[w:Orange County Choppers|Orange County Choppers]]
|-
| 10B || Brenner Tank (truck trailer)
|-
| 10R || E-Z-GO
|-
| 10T || Oshkosh Corporation
|-
| 11H || Hendrickson Mobile Equipment, Inc. (fire engines - incomplete vehicle)
|-
| 11V || Kalmar Solutions (Truck - Terminal Tractor)
|-
| 12A || Avanti
|-
| 137 || AM General Hummer & Hummer H1
|-
| 13N || Fontaine (truck trailer)
|-
| 15G || Gillig bus
|-
| 16C || Clenet Coachworks
|-
| 16W || Certified Stainless Services Inc. DBA West-Mark (truck trailer) (prior to 2010)
|-
| 16X || Vixen 21 motorhome
|-
| 17N || John Deere incomplete vehicle (RV chassis)
|-
| 18X || Western Recreational Vehicles
|-
| 19U || Acura car made by Honda of America Mfg. in Ohio
|-
| 19V || Acura car made by Honda Manufacturing of Indiana
|-
| 19X || Honda car made by Honda Manufacturing of Indiana
|-
| 2A3 || Imperial
|-
| 2A4 2A8 || Chrysler brand MPV/SUV 2006–2011 only
|-
| 2AY 2AZ || Hino
|-
| 2BC || Jeep Wrangler (YJ) 1987–1988 (using AMC-style VIN structure)
|-
| 2BP || Ski-Doo
|-
| 2BV || Can-Am & Bombardier ATV
|-
| 2BW || Can-Am Commander E LSV
|-
| 2BX || Can-Am Spyder & Canyon 3-wheelers
|-
| 2BZ || Can-Am Freedom Trailer for Can-Am Spyder & Canyon
|-
| 2B1 || Orion Bus Industries
|-
| 2B3 || Dodge car 1981–2011
|-
| 2B4 || Dodge MPV 1981–2002
|-
| 2B5 || Dodge "bus" (van with more than 3 rows of seats) 1981–2002
|-
| 2B6 || Dodge incomplete vehicle 1981–2002
|-
| 2B7 || Dodge truck 1981–2002
|-
| 2B9/001 || BWS Manufacturing (truck trailer)
|-
| 2C1 || Geo/Chevrolet car made by CAMI Automotive
|-
| 2C3 || Chrysler brand car 1981–2011
|-
| 2C3 || Chrysler Group (all brands) car (including Lancia) 2012-
|-
| 2C4 || Chrysler brand MPV/SUV 2000–2005
|-
| 2C4 || Chrysler Group (all brands) MPV (including Lancia Voyager & Volkswagen Routan) 2012-
|-
| 2C7 || Pontiac car made by CAMI Automotive only sold by GM Canada
|-
| 2C8 || Chrysler brand MPV/SUV 2001–2005
|-
| 2C9/145 || Campagna Motors
|-
| 2C9/197 || Canadian Electric Vehicles
|-
| 2CC || American Motors Corporation MPV
|-
| 2CG || Asüna/Pontiac SUV made by CAMI Automotive only sold by GM Canada
|-
| 2CK || GMC Tracker SUV made by CAMI Automotive only sold by GM Canada 1990–1991 only
|-
| 2CK || Pontiac Torrent SUV made by CAMI Automotive 2006–2009 only
|-
| 2CM || American Motors Corporation car
|-
| 2CN || Geo/Chevrolet SUV made by CAMI Automotive 1990–2011 only
|-
| 2CT || GMC Terrain SUV made by CAMI Automotive 2010–2011 only
|-
| 2D4 || Dodge MPV 2003–2011 only
|-
| 2D6 || Dodge incomplete vehicle 2003
|-
| 2D7 || Dodge truck 2003
|-
| 2D8 || Dodge MPV 2003–2011 only
|-
| 2DG || Ontario Drive & Gear
|-
| 2DM || Di-Mond Trailers (truck trailer)
|-
| 2DN || Dynasty Electric Car Corporation
|-
| 2EZ || Electra Meccanica Vehicles Corp. (Solo)
|-
| 2E3 || Eagle car 1989–1997 (using Chrysler-style VIN structure)
|-
| 2E4 || 2011 Lancia MPV (Voyager)
|-
| 2E9/080 || Electra Meccanica Vehicles Corp. (Solo)
|-
| 2FA || [[../Ford/VIN Codes|Ford]] car
|-
| 2FH || Zenn Motor Co., Ltd. (low-speed vehicle)
|-
| 2FM || [[../Ford/VIN Codes|Ford]] MPV/SUV
|-
| 2FT || [[../Ford/VIN Codes|Ford]] truck
|-
| 2FU || Freightliner (truck)
|-
| 2FV || Freightliner (incomplete vehicle)
|-
| 2FW || Sterling Trucks (truck-complete vehicle)
|-
| 2FY || New Flyer
|-
| 2FZ || Sterling Trucks (incomplete vehicle)
|-
| 2Gx || [[../GM/VIN Codes|General Motors]] Canada
|-
| 2G0 || GMC "bus" (van with more than 3 rows of seats) 1981–1986
|-
| 2G1 || [[../GM/VIN Codes|Chevrolet]] car
|-
| 2G2 || [[../GM/VIN Codes|Pontiac]] car
|-
| 2G3 || [[../GM/VIN Codes|Oldsmobile]] car
|-
| 2G4 || [[../GM/VIN Codes|Buick]] car
|-
| 2G5 || GMC MPV 1981–1986
|-
| 2G5 || Chevrolet BrightDrop / BrightDrop Zevo truck 2023-2026
|-
| 2G6 || [[../GM/VIN Codes|Cadillac]] car
|-
| 2G7 || Pontiac car only sold by GM Canada
|-
| 2G8 || Chevrolet MPV 1981–1986
|-
| 2GA || Chevrolet "bus" (van with more than 3 rows of seats)
|-
| 2GB || Chevrolet incomplete vehicle
|-
| 2GC || Chevrolet truck
|-
| 2GD || GMC incomplete vehicle
|-
| 2GE || Cadillac incomplete vehicle
|-
| 2GH || GMC GM New Look bus & GM Classic series bus
|-
| 2GJ || GMC "bus" (van with more than 3 rows of seats) 1987–
|-
| 2GK || GMC MPV/SUV 1987–
|-
| 2GN || Chevrolet MPV/SUV 1987-
|-
| 2GT || GMC truck
|-
| 2HG || [[../Honda/VIN Codes|Honda]] car made by Honda of Canada Manufacturing
|-
| 2HH || Acura car made by Honda of Canada Manufacturing
|-
| 2HJ || [[../Honda/VIN Codes|Honda]] truck made by Honda of Canada Manufacturing
|-
| 2HK || [[../Honda/VIN Codes|Honda]] MPV/SUV made by Honda of Canada Manufacturing
|-
| 2HM || Hyundai Canada
|-
| 2HN || Acura SUV made by Honda of Canada Manufacturing
|-
| 2HP || International Trucks (complete vehicle - straight truck)
|-
| 2HS || International Trucks (complete vehicle - truck tractor)
|-
| 2HT || International Trucks (incomplete vehicle - straight truck)
|-
| 2HV || International or IC Bus (incomplete vehicle - bus)
|-
| 2J4 || Jeep Wrangler (YJ) 1989–1992 (using Chrysler-style VIN structure)
|-
| 2L1 || Lincoln incomplete vehicle – limo
|-
| 2LD || Triple E Canada Ltd.
|-
| 2LJ || Lincoln incomplete vehicle – hearse
|-
| 2LM || Lincoln SUV
|-
| 2LN || Lincoln car
|-
| 2M1 || Mack Trucks Canada (truck)
|-
| 2M2 || Mack Trucks Canada (incomplete vehicle)
|-
| 2M3 || Mack Truck Canada (glider)
|-
| 2ME || [[../Ford/VIN Codes|Mercury]] car
|-
| 2MG || Motor Coach Industries (Produced from Sept. 1, 2008 on)
|-
| 2MH || [[../Ford/VIN Codes|Mercury]] incomplete vehicle
|-
| 2MR || [[../Ford/VIN Codes|Mercury]] MPV
|-
| 2M9/044 || Westward Industries
|-
| 2M9/058 || Motor Coach Industries
|-
| 2NK || Kenworth incomplete vehicle
|-
| 2NP || Peterbilt incomplete vehicle
|-
| 2NV || Nova Bus
|-
| 2P3 || Plymouth car
|-
| 2P4 || Plymouth MPV 1981–2000
|-
| 2P5 || Plymouth "bus" (van with more than 3 rows of seats) 1981–1983
|-
| 2P9/001 || Prevost 1981–1995
|-
| 2PC || Prevost 1996-
|-
| 2S2 || Suzuki car made by CAMI Automotive
|-
| 2S3 || Suzuki SUV made by CAMI Automotive
|-
| 2TU || Tri-Star Industries Limited
|-
| 2T1 || [[../Toyota/VIN Codes|Toyota]] car made by TMMC
|-
| 2T2 || Lexus SUV made by TMMC
|-
| 2T3 || [[../Toyota/VIN Codes|Toyota]] SUV made by TMMC
|-
| 2T9/206 || Triple E Canada Ltd.
|-
| 2V4 || Volkswagen Routan made by Chrysler Canada
|-
| 2V8 || Volkswagen Routan made by Chrysler Canada
|-
| 2W9/044 || Westward Industries
|-
| 2WK || Western Star (truck)
|-
| 2WL || Western Star (incomplete vehicle)
|-
| 2WM || Western Star (glider)
|-
| 2XK || Kenworth (truck)
|-
| 2XM || Eagle Premier 1988 only (using AMC-style VIN structure)
|-
| 2XP || Peterbilt (truck)
|-
| 3A4 3A8 || Chrysler brand MPV 2006–2010 only
|-
| 3A9/050 || MARGO (truck trailer)
|-
| 3AK || Freightliner Trucks (truck)
|-
| 3AL || Freightliner Trucks (incomplete vehicle)
|-
| 3AW || Fruehauf de Mexico (truck trailer)
|-
| 3AX || Scania Mexico
|-
| 3BE || Scania Mexico (buses)
|-
| 3BH || Western Star 3700 (truck) made by DINA S.A.
|-
| 3BH || Western Star (truck)
|-
| 3BJ || Western Star 3700 (incomplete vehicle) made by DINA S.A.
|-
| 3BJ || Western Star (incomplete vehicle)
|-
| 3BK || Kenworth (incomplete vehicle)
|-
| 3BM || Motor Coach Industries bus made by DINA S.A.
|-
| 3BP || Peterbilt (incomplete vehicle)
|-
| 3B3 || Dodge car 1981–2011
|-
| 3B4 || Dodge SUV 1986–1993
|-
| 3B6 || Dodge incomplete vehicle 1981–2002
|-
| 3B7 || Dodge truck 1981–2002
|-
| 3C3 || Chrysler brand car 1981–2011
|-
| 3C3 || Chrysler Group (all brands) car (including Fiat) 2012-
|-
| 3C4 || Chrysler brand MPV 2001–2005
|-
| 3C4 || Chrysler Group (all brands) MPV (including Fiat) 2012-
|-
| 3C6 || Chrysler Group (all brands) truck 2012–
|-
| 3C7 || Chrysler Group (all brands) incomplete vehicle 2012–
|-
| 3C8 || Chrysler brand MPV 2001–2005
|-
| 3CA || Chrysler brand MPV 2001 (PT Cruiser w/serial# 232057-265662)
|-
| 3CE || Volvo Buses de Mexico
|-
| 3CG || KTMMEX S.A. de C.V.
|-
| 3CZ || Honda SUV made by Honda de Mexico
|-
| 3D2 || Dodge incomplete vehicle 2007–2009
|-
| 3D3 || Dodge truck 2006–2009
|-
| 3D4 || Dodge SUV 2009–2011
|-
| 3D6 || Dodge incomplete vehicle 2003–2011
|-
| 3D7 || Dodge truck 2002–2011
|-
| 3EL || ATRO (truck trailer)
|-
| 3E4 || 2011 Fiat SUV (Freemont)
|-
| 3FA || [[../Ford/VIN Codes|Ford]] car
|-
| 3FC || Ford stripped chassis made by Ford & IMMSA
|-
| 3FE || [[../Ford/VIN Codes|Ford]] Mexico
|-
| 3FM || [[../Ford/VIN Codes|Ford]] MPV/SUV
|-
| 3FN || Ford F-650/F-750 made by Blue Diamond Truck Co. (truck)
|-
| 3FR || Ford F-650/F-750 & Ford LCF made by Blue Diamond Truck Co. (incomplete vehicle)
|-
| 3FT || [[../Ford/VIN Codes|Ford]] truck
|-
| 3F6 || Sterling Bullet
|-
| 3G || [[../GM/VIN Codes|General Motors]] Mexico
|-
| 3G0 || Saab 9-4X 2011
|-
| 3G0 || Holden Equinox 2018–2020
|-
| 3G1 || [[../GM/VIN Codes|Chevrolet]] car
|-
| 3G2 || [[../GM/VIN Codes|Pontiac]] car
|-
| 3G4 || [[../GM/VIN Codes|Buick]] car
|-
| 3G5 || [[../GM/VIN Codes|Buick]] SUV
|-
| 3G7 || [[../GM/VIN Codes|Pontiac]] SUV
|-
| 3GA || JAC models assembled by Giant Motors in Mexico
|-
| 3GC || Chevrolet truck
|-
| 3GK || GMC SUV
|-
| 3GM || Holden Suburban
|-
| 3GN || Chevrolet SUV
|-
| 3GP || Honda Prologue EV made by GM
|-
| 3GS || Saturn SUV
|-
| 3GT || GMC truck
|-
| 3GY || Cadillac SUV
|-
| 3H1 || Honda motorcycle/UTV
|-
| 3H3 || Hyundai de Mexico, S.A. de C.V. for Hyundai Translead (truck trailers)
|-
| 3HA || International Trucks (incomplete vehicle - straight truck) made by Blue Diamond Truck Co. 2011-2015
|-
| 3HA || International Trucks (incomplete vehicle - straight truck) made by Navistar Mexico/International Motors Mexico 2016-
|-
| 3HC || International Trucks (complete vehicle - truck tractor) made by Blue Diamond Truck Co. 2011-2015
|-
| 3HC || International Trucks (complete vehicle - truck tractor) made by Navistar Mexico/International Motors Mexico 2016-
|-
| 3HD || Acura SUV made by Honda de Mexico
|-
| 3HG || [[../Honda/VIN Codes|Honda]] car made by Honda de Mexico
|-
| 3HR || International Trucks (complete vehicle - truck)
|-
| 3HS || International Trucks & Caterpillar Trucks (complete vehicle - truck tractor)
|-
| 3HT || International Trucks & Caterpillar Trucks (incomplete vehicle - straight truck)
|-
| 3HV || International (incomplete vehicle - bus)
|-
| 3JB || BRP Mexico (Can-Am ATV/UTV & Can-Am Ryker 3-wheeler)
|-
| 3JC || BRP Mexico (Can-Am Origin & Pulse electric 2-wheel motorcycles)
|-
| 3KM || Kia/Hyundai MPV/SUV made by KMMX
|-
| 3KP || Kia/Hyundai car made by KMMX
|-
| 3LN || Lincoln car
|-
| 3MA || Mercury car (1988-1995)
|-
| 3MD || Mazda de Mexico car (Mazda 2)
|-
| 3ME || Mercury car (1996-2011)
|-
| 3MF || BMW M car
|-
| 3MG || Isuzu Motors de Mexico
|-
| 3MJ || Mazda CX-3 (Mazda de Mexico)
|-
| 3MV || Mazda de Mexico SUV (Mazda CX-30)
|-
| 3MW || BMW car
|-
| 3MY || Toyota car made by Mazda de Mexico Vehicle Operation
|-
| 3MZ || Mazda de Mexico car (Mazda 3)
|-
| 3N1 || Nissan Mexico car
|-
| 3N6 || Nissan Mexico truck & Chevrolet City Express
|-
| 3N8 || Nissan Mexico MPV
|-
| 3NS || Polaris Industries ATV
|-
| 3NE || Polaris Industries UTV
|-
| 3P3 || Plymouth car
|-
| 3PC || Infiniti SUV made by COMPAS
|-
| 3TM || Toyota truck made by TMMBC
|-
| 3TY || Toyota truck made by TMMGT
|-
| 3VV || Volkswagen Mexico SUV
|-
| 3VW || Volkswagen Mexico car
|-
| 3WK || Kenworth truck
|-
| 3WP || Peterbilt truck
|-
| 3X1 || Mack Truck Mexico (truck)
|-
| 3X2 || Mack Truck Mexico (incomplete vehicle)
|-
| 4A3 || Mitsubishi Motors car
|-
| 4A4 || Mitsubishi Motors SUV
|-
| 4B3 || Dodge car made by Diamond-Star Motors factory
|-
| 4B9/038 || BYD Coach & Bus LLC
|-
| 4C3 || Chrysler car made by Diamond-Star Motors factory
|-
| 4C6 || Reinke Manufacturing Company (truck trailer)
|-
| 4C9/272 || Christini Technologies (motorcycle)
|-
| 4C9/561 || Czinger
|-
| 4C9/626 || Canoo Inc.
|-
| 4CD || Oshkosh Chassis Division incomplete vehicle (RV chassis)
|-
| 4DR || IC Bus (complete vehicle - bus)
|-
| 4E3 || Eagle car made by Diamond-Star Motors factory
|-
| 4EN || E-ONE, Inc. (fire engines - truck)
|-
| 4EZ || KZ Recreational Vehicles (trailer)
|-
| 4F2 || Mazda SUV made by Ford
|-
| 4F4 || Mazda truck made by Ford
|-
| 4G1 || Chevrolet Cavalier convertible made by Genasys L.C. – a GM/ASC joint venture
|-
| 4G2 || Pontiac Sunfire convertible made by Genasys L.C. – a GM/ASC joint venture
|-
| 4G3 || Toyota Cavalier made by GM
|-
| 4G5 || General Motors EV1
|-
| 4GD || WhiteGMC Brigadier 1988–1989 made by GM
|-
| 4GD || Opel/Vauxhall Sintra
|-
| 4GL || Buick incomplete vehicle
|-
| 4GT || Isuzu incomplete vehicle built by GM
|-
| 4JG || [[../Mercedes-Benz/VIN Codes|Mercedes-Benz]] SUV
|-
| 4J8 || LBT, Inc. (truck trailer)
|-
| 4KA || IC Bus (complete vehicle - truck)
|-
| 4KB || Chevrolet W-Series (gas engine only) made by GM (Incomplete Vehicle - medium duty)
|-
| 4KD || GMC W-Series (gas engine only) made by GM (Incomplete Vehicle - medium duty)
|-
| 4KL || Isuzu N-Series (gas engine only) made by GM (Incomplete Vehicle - medium duty)
|-
| 4LM || Capacity Trucks (truck) [terminal tractors]
|-
| 4M2 || [[../Ford/VIN Codes|Mercury]] MPV/SUV
|-
| 4M9/220 || Meyers Manx, LLC (Manx 2.0 EV) [Passenger Car - Replica]
|-
| 4ML || Oshkosh Trailer Division
|-
| 4MZ || Buell Motorcycle Company (Mid-1995 – )
|-
| 4N2 || Nissan Quest made by Ford
|-
| 4NU || Isuzu Ascender made by GM
|-
| 4PR || Hughes Trailers of Jackson (trailer)
|-
| 4P1 || Pierce Manufacturing Inc. USA
|-
| 4P3 || Plymouth car made by Diamond-Star Motors factory 1990–1994
|-
| 4P3 || Mitsubishi Motors SUV made by Mitsubishi Motor Manufacturing of America 2013–2015 for export only
|-
| 4RK || Nova Bus & Prevost made by Nova Bus (US) Inc.
|-
| 4S1 || Isuzu truck made by Subaru Isuzu Automotive
|-
| 4S2 || Isuzu SUV made by Subaru Isuzu Automotive & 2nd gen. Holden Frontera made by SIA
|-
| 4S3 || [[../Subaru/VIN Codes|Subaru]] car
|-
| 4S4 || [[../Subaru/VIN Codes|Subaru]] SUV/MPV
|-
| 4S6 || Honda SUV made by Subaru Isuzu Automotive
|-
| 4S7 || Spartan Motors incomplete vehicle
|-
| 4S9/197 || Smith Electric Vehicles
|-
| 4S9/345 || Satellite Suites (trailer)
|-
| 4S9/419 || Spartan Motors truck
|-
| 4S9/454 || Scuderia Cameron Glickenhaus passenger car
|-
| 4S9/520 || Signature Autosport, LLC (Osprey Custom Cars)
|-
| 4S9/542 || Scuderia Cameron Glickenhaus SCG Boot (M.P.V.)
|-
| 4S9/544 || Scuderia Cameron Glickenhaus passenger car
|-
| 4S9/559 || Spartan Fire, LLC truck (formerly Spartan ER)
|-
| 4S9/560 || Spartan Fire, LLC incomplete vehicle (formerly Spartan ER)
|-
| 4S9/569 || SC Autosports, LLC (Kandi)
|-
| 4TA || [[../Toyota/VIN Codes|Toyota]] truck made by NUMMI
|-
| 4T1 || [[../Toyota/VIN Codes|Toyota]] car made by Toyota Motor Manufacturing Kentucky
|-
| 4T3 || [[../Toyota/VIN Codes|Toyota]] MPV/SUV made by Toyota Motor Manufacturing Kentucky
|-
| 4T4 || [[../Toyota/VIN Codes|Toyota]] car made by Subaru of Indiana Automotive
|-
| 4T9/208 || Xos, Inc.
|-
| 4T9/228 || Lumen Motors
|-
| 4UF || Arctic Cat Inc.
|-
| 4US || BMW car
|-
| 4UZ || Freightliner Custom Chassis Corporation & <br /> gas-powered Mitsubishi Fuso trucks assembled by Freightliner Custom Chassis & <br /> Thomas Built Buses FS-65 & Saf-T-Liner C2
|-
| 4V0 || Crossroads RV (recreational vehicles)
|-
| 4V1 || WhiteGMC (truck) 1988-1995
|-
| 4V2 || WhiteGMC (incomplete vehicle) 1988-1995
|-
| 4V3 || WhiteGMC (glider) 1988-1995
|-
| 4V1 || Volvo Trucks North America [low cab-over engine] (truck) 2000-2003
|-
| 4V2 || Volvo Trucks North America [low cab-over engine] (incomplete vehicle) 2000-2003
|-
| 4V4 || Volvo Trucks North America [conventional] (truck) 1996+
|-
| 4V5 || Volvo Trucks North America [conventional] (incomplete vehicle) 1996+
|-
| 4V6 || Volvo Trucks North America (glider)
|-
| 4VA || Volvo Trucks North America [conventional- Class 7 w/air brakes] (truck) 1997-1999
|-
| 4VB || Volvo Trucks North America [conventional- Class 7 w/air brakes] (incomplete vehicle) 1997-1999
|-
| 4VC || Volvo Trucks North America [conventional- Class 7 w/hydraulic brakes] (incomplete vehicle)
|-
| 4VD || Volvo Trucks North America [low cab-over engine- Class 7 w/air brakes] (truck)
|-
| 4VE || Volvo Trucks North America [low cab-over engine- Class 7 w/air brakes] (incomplete vehicle)
|-
| 4VG || Volvo Trucks North America [conventional- Class 8 w/air brakes] (truck) 1997-1999
|-
| 4VH || Volvo Trucks North America [conventional- Class 8 w/air brakes] (incomplete vehicle) 1997-1999
|-
| 4VJ || Volvo Trucks North America [high cab-over engine- Class 8 w/air brakes] (truck)
|-
| 4VK || Volvo Trucks North America [high cab-over engine- Class 8 w/air brakes] (incomplete vehicle)
|-
| 4VL || Volvo Trucks North America [low cab-over engine- Class 8 w/air brakes] (truck)
|-
| 4VM || Volvo Trucks North America [low cab-over engine- Class 8 w/air brakes] (incomplete vehicle)
|-
| 4VZ || Spartan Motors/The Shyft Group (incomplete vehicle – bare chassis only)
|-
| 4WW || Wilson Trailer Sales
|-
| 4W1 || '24+ Chevrolet Suburban HD made by GM Defense for US govt. in Concord, NC
|-
| 4W5 || Acura ZDX EV made by GM
|-
| 4XA || Polaris Inc.
|-
| 4X4 || Forest River
|-
| 4YD || KeyStone RV Company (recreational vehicle)
|-
| 4YM || Carry-On Trailer, Inc.
|-
| 4YM || Anderson Manufacturing (trailer)
|-
| 4Z3 || American LaFrance truck
|-
| 43C || Consulier
|-
| 44K || HME Inc. (fire engines - incomplete vehicle) (HME=Hendrickson Mobile Equipment)
|-
| 46G || Gillig incomplete vehicle
|-
| 46J || Federal Motors Inc
|-
| 478 || Honda ATV
|-
| 480 || Sterling Trucks (truck)
|-
| 49H || Sterling Trucks (incomplete vehicle)
|-
| 5AS || Global Electric Motorcars (GEM) 1999-2011
|-
| 5AX || Armor Chassis (truck trailer)
|-
| 5A4 || Load Rite Trailers Inc.
|-
| 5BP || Solectria
|-
| 5BZ || Nissan "bus" (van with more than 3 rows of seats)
|-
| 5B4 || Workhorse Custom Chassis, LLC incomplete vehicle (RV chassis)
|-
| 5CD || Indian Motorcycle Company of America (Gilroy, CA)
|-
| 5CJ || Western Star Trucks (incomplete vehicle)
|-
| 5CK || Western Star Trucks (truck)
|-
| 5CX || Shelby Series 1
|-
| 5DF || Thomas Dennis Company LLC
|-
| 5DG || Terex Advance Mixer, Inc. (Formerly Advance Mixer, Inc.) (truck)
|-
| 5EH || Excelsior-Henderson Motorcycle
|-
| 5EO || Cottrell (truck trailer)
|-
| 5FC || Columbia Vehicle Group (Columbia, Tomberlin) (low-speed vehicles)
|-
| 5FN || Honda MPV/SUV made by Honda Manufacturing of Alabama
|-
| 5FP || Honda truck made by Honda Manufacturing of Alabama
|-
| 5FR || Acura SUV made by Honda Manufacturing of Alabama
|-
| 5FT || Feeling Trailers
|-
| 5FY || New Flyer
|-
| 5GA || Buick MPV/SUV
|-
| 5GD || Daewoo G2X
|-
| 5GN || Hummer H3T
|-
| 5GR || Hummer H2
|-
| 5GT || Hummer H3
|-
| 5GZ || Saturn MPV/SUV
|-
| 5G8 || Holden Volt
|-
| 5HD || Harley-Davidson for export markets
|-
| 5HT || Heil Trailer (truck trailer)
|-
| 5J1 || Big Dog Motorcycles (Mid-2002 – )
|-
| 5J5 || Club Car (low-speed vehicle)
|-
| 5J6 || Honda SUV made by Honda of America Mfg. in Ohio
|-
| 5J8 || Acura SUV made by Honda of America Mfg. in Ohio
|-
| 5KB || Honda car made by Honda Manufacturing of Alabama
|-
| 5KJ || Western Star Trucks (truck)
|-
| 5KK || Western Star Trucks (incomplete vehicle)
|-
| 5KM || Vento Motorcycles
|-
| 5KT || Karavan Trailers
|-
| 5L1 || [[../Ford/VIN Codes|Lincoln]] SUV - Limousine (2004–2009)
|-
| 5L5 || American IronHorse Motorcycle
|-
| 5LD || Ford & Lincoln incomplete vehicle – limousine (2010–2014)
|-
| 5LM || [[../Ford/VIN Codes|Lincoln]] SUV
|-
| 5LT || [[../Ford/VIN Codes|Lincoln]] truck
|-
| 5MZ || Buell Motorcycle Company for export markets
|-
| 5N1 || Nissan & Infiniti SUV
|-
| 5N3 || Infiniti SUV
|-
| 5NH || Forest River
|-
| 5NM || Hyundai SUV made by HMMA
|-
| 5NP || Hyundai car made by HMMA
|-
| 5NT || Hyundai truck made by HMMA
|-
| 5PV || Hino incomplete vehicle made by Hino Motors Manufacturing USA
|-
| 5RJ || International MXT made by Android Industries - Springfield LLC
|-
| 5RX || Heartland Recreational Vehicles
|-
| 5S3 || Saab 9-7X
|-
| 5SA || Suzuki Manufacturing of America Corp. (ATV)
|-
| 5SX || American LaFrance incomplete vehicle (Condor)
|-
| 5TB || [[../Toyota/VIN Codes|Toyota]] truck made by TMMI
|-
| 5TD || Toyota MPV/SUV & Lexus TX made by TMMI
|-
| 5TE || Toyota truck made by NUMMI
|-
| 5TF || Toyota truck made by TMMTX
|-
| 5TU || Construction Trailer Specialist (truck trailer)
|-
| 5UM || BMW M car
|-
| 5UX || BMW SUV
|-
| 5VC || Autocar incomplete vehicle
|-
| 5VF || American Electric Vehicle Company (low-speed vehicle)
|-
| 5VK || Great Northern Trailer Works (truck trailer)
|-
| 5VP || Victory Motorcycles
|-
| 5V4 || Autocar truck
|-
| 5V8 || Vanguard National (truck trailer)
|-
| 5WE || IC Bus (incomplete vehicle - bus or truck)
|-
| 5XX || Kia car made by KMMG
|-
| 5XY || Kia/Hyundai SUV made by KMMG
|-
| 5YA || Indian Motorcycle Company (Kings Mountain, NC)
|-
| 5YF || Toyota car made by TMMMS
|-
| 5YJ || Tesla, Inc. passenger car (only used for US-built Model S and Model 3 starting from Nov, 1st 2021)
|-
| 5YM || BMW M SUV
|-
| 5YN || Cruise Car, Inc.
|-
| 5Y2 || Pontiac Vibe made by NUMMI
|-
| 5Y4 || Yamaha Motor Motor Mfg. Corp. of America (ATV, UTV)
|-
| 5ZT || Forest River (recreational vehicles)
|-
| 5ZU || Greenkraft (truck)
|-
| 5Z6 || Suzuki Equator (truck) made by Nissan
|-
| 50E || Lucid Motors passenger car
|-
| 50G || Karma Automotive
|-
| 50H || Norstar Company (truck trailers, truck beds)
|-
| 516 || Autocar truck
|-
| 51R || Brammo Motorcycles
|-
| 51T || Monaco RV LLC/Navistar RV LLC: Monaco (trailer)
|-
| 51U || Monaco RV LLC/Navistar RV LLC: Holiday Rambler 2010- (trailer)
|-
| 51V || Monaco RV LLC/Navistar RV LLC: R-Vision (trailer)
|-
| 51X || Monaco RV LLC/Navistar RV LLC: McKenzie (trailer)
|-
| 51Z || Monaco RV LLC/Navistar RV LLC: Monaco RV [Roadmaster Chassis] (incomplete vehicle)
|-
| 522 || GreenGo Tek (low-speed vehicle)
|-
| 523 || VPG (The Vehicle Production Group)
|-
| 52C || GEM subsidiary of Polaris Inc.
|-
| 537 || Azure Dynamics Transit Connect Electric
|-
| 538 || Zero Motorcycles
|-
| 53G || Coda Automotive
|-
| 53T || Think North America in Elkhart, IN
|-
| 546 || EBR Motorcycles
|-
| 54C || Winnebago Industries travel trailer
|-
| 54D || Isuzu & Chevrolet commercial trucks built by Spartan Motors/The Shyft Group
|-
| 54F || Rosenbauer Motors (incomplete vehicle)
|-
| 55S || Mercedes-Benz car
|-
| 56E || Armor Lite Trailer Mfg. (truck trailers)
|-
| 56K || Indian Motorcycle International, LLC (Polaris subsidiary)
|-
| 573 || Grand Design RV (truck trailer)
|-
| 57C || Maurer Manufacturing (truck trailer)
|-
| 57R || Oreion Motors
|-
| 57S || Lightning Motors Corp. (electric motorcycles)
|-
| 57W || Mobility Ventures
|-
| 57X || Polaris Slingshot
|-
| 58A || Lexus car made by TMMK (Lexus ES)
|-
| 6AB || MAN Australia
|-
| 6AM || Jayco Corp. (RVs)
|-
| 6F1 || Ford
|-
| 6F2 || Iveco Trucks Australia Ltd.
|-
| 6F4 || Nissan Motor Company Australia
|-
| 6F5 || Kenworth Australia
|-
| 6FM || Mack Trucks Australia
|-
| 6FP || [[../Ford/VIN Codes|Ford]] Australia
|-
| 6G1 || [[../GM/VIN Codes|General Motors]]-Holden (post Nov 2002), Chevrolet 2000-2013, Vauxhall Monaro & VXR8 ('08-'17), Daewoo Statesman & Veritas
|-
| 6G2 || [[../GM/VIN Codes|Pontiac]] made in Australia ('04-'06 GTO & '08-'09 G8)
|-
| 6G3 || [[../GM/VIN Codes|General Motors]] Chevrolet Caprice PPV & SS performance sedan 2014-2017, Middle East mkt. Chevrolet Caprice '14-'17
|-
| 6H8 || [[../GM/VIN Codes|General Motors]]-Holden (pre Nov 2002)
|-
| 6KT || BCI Bus
|-
| 6MM || Mitsubishi Motors Australia
|-
| 6MP || Mercury Capri 1991-1994
|-
| 6T1 || [[../Toyota/VIN Codes|Toyota]] Motor Corporation Australia
|-
| 6T9 || Privately Imported car (VIN issued by Victoria) or Trailer in Australia
|-
| 6U9 || Privately Imported car in Australia
|-
| 6Y9/043 || Intertruck Distributors (NZ) Ltd. - International Trucks New Zealand
|-
| 6ZZ || Privately Imported car in Australia
|-
| 7AB || MAN New Zealand
|-
| 7AT || VIN assigned by the New Zealand Transport Authority Waka Kotahi from 29 November 2009
|-
| 7A1 || Mitsubishi New Zealand
|-
| 7A3 || Honda New Zealand
|-
| 7A4 || Toyota New Zealand
|-
| 7A5 || Ford New Zealand
|-
| 7A7 || Nissan New Zealand
|-
| 7A8 || VIN assigned by the New Zealand Transport Authority Waka Kotahi before 29 November 2009
|-
| 7B2 || Nissan Diesel bus New Zealand
|-
| 7FA || Honda SUV made by Honda Manufacturing of Indiana
|-
| 7FC || Rivian truck
|-
| 7F7 || Arcimoto, Inc.
|-
| 7GZ || GMC incomplete vehicles (Savana cutaway) made by Navistar International/International Motors
|-
| 7G0 || Faraday Future
|-
| 7G2 || Tesla, Inc. truck (used for Nevada-built Semi Trucks & Texas-built Cybertruck)
|-
| 7H4 || Hino truck
|-
| 7H8 || Cenntro Electric Group Limited low-speed vehicle
|-
| 7JD || Volvo Cars SUV
|-
| 7JR || Volvo Cars passenger car
|-
| 7JS || White River Marine Group (trailer)
|-
| 7JZ || Proterra From mid-2019 on
|-
| 7KG || Vanderhall Motor Works
|-
| 7KY || Dorsey (truck trailer)
|-
| 7MM || Mazda SUV made by MTMUS (Mazda-Toyota Joint Venture)
|-
| 7MU || Toyota SUV made by MTMUS (Mazda-Toyota Joint Venture)
|-
| 7MW || Cenntro Electric Group Limited truck
|-
| 7MZ || HDK electric vehicles
|-
| 7NA || Navistar Defense/ND Defense
|-
| 7NY || Lordstown Motors
|-
| 7PD || Rivian SUV
|-
| 7RZ || Electric Last Mile Solutions
|-
| 7SA || Tesla, Inc. (US-built MPVs (e.g. Model X, Model Y))
|-
| 7SU || Blue Arc electric trucks made by The Shyft Group
|-
| 7SV || [[../Toyota/VIN Codes|Toyota]] SUV made by TMMTX
|-
| 7SX || Global Electric Motorcars (WAEV) 2022-
|-
| 7SY || Polestar SUV
|-
| 7TN || Canoo
|-
| 7UU || Lucid Motors MPV/SUV
|-
| 7UZ || Kaufman Trailers (trailer)
|-
| 7VV || Ree Automotive
|-
| 7WA || Scout Motors (MPV)
|-
| 7WE || Bollinger Motors incomplete vehicle
|-
| 7XB || Denago EV Corporation (Low-Speed Vehicle)
|-
| 7YA || Hyundai & Kia MPV/SUV made by HMGMA
|-
| 7ZJ || Meyers Manx, LLC (Manx EV Resorter) [Low Speed Vehicle]
|-
| 7Z0 || Zoox
|-
| 71T || Slate Auto (truck)
|-
| 71V || Slate Auto (MPV)
|-
| 722 || Isuzu North America Corp. (incomplete vehicle - medium duty)
|-
| 8AB || Mercedes Benz truck & bus (Argentina)
|-
| 8AC || Mercedes Benz vans (for South America)
|-
| 8AD || Peugeot Argentina
|-
| 8AE || Peugeot van
|-
| 8AF || [[../Ford/VIN Codes|Ford]] Argentina
|-
| 8AG || [[../GM/VIN Codes|Chevrolet]] Argentina
|-
| 8AJ || [[../Toyota/VIN Codes|Toyota]] Argentina
|-
| 8AK || Suzuki Argentina
|-
| 8AN || Nissan Argentina
|-
| 8AP || Fiat Argentina
|-
| 8AT || Iveco Argentina
|-
| 8AW || Volkswagen Argentina
|-
| 8A1 || Renault Argentina
|-
| 8A3 || Scania Argentina
|-
| 8A7 || Minarelli S.A.
|-
| 8BB || Agrale Argentina S.A.
|-
| 8BC || Citroën Argentina
|-
| 8BN || Mercedes-Benz incomplete vehicle (North America)
|-
| 8BR || Mercedes-Benz "bus" (van with more than 3 rows of seats) (North America)
|-
| 8BT || Mercedes-Benz MPV (van with 2 or 3 rows of seats) (North America)
|-
| 8BU || Mercedes-Benz truck (cargo van with 1 row of seats) (North America)
|-
| 8CH || Honda motorcycle
|-
| 8C3 || Honda car/SUV
|-
| 8G1 || Automotores Franco Chilena S.A. Renault
|-
| 8GD || Automotores Franco Chilena S.A. Peugeot
|-
| 8GG || [[../GM/VIN Codes|Chevrolet]] Chile
|-
| 8LD || General Motors OBB - Chevrolet Ecuador
|-
| 8LF || Maresa (Mazda)
|-
| 8LG || Aymesa (Hyundai Motor & Kia)
|-
| 8L4 || Great Wall Motors made by Ciudad del Auto (Ciauto)
|-
| 8XD || Ford Motor Venezuela
|-
| 8XJ || Mack de Venezuela C.A.
|-
| 8XV || Iveco Venezuela C.A.
|-
| 8Z1 || General Motors Venezolana C.A.
|-
| 829 || Industrias Quantum Motors S.A. (Bolivia)
|-
| 9BD || Fiat Brazil & Dodge, Ram made by Fiat Brasil
|-
| 9BF || [[../Ford/VIN Codes|Ford]] Brazil
|-
| 9BG || [[../GM/VIN Codes|Chevrolet]] Brazil
|-
| 9BH || Hyundai Motor Brasil
|-
| 9BM || Mercedes-Benz Brazil car, SUV, commercial truck & bus
|-
| 9BN || Mafersa
|-
| 9BR || [[../Toyota/VIN Codes|Toyota]] Brazil
|-
| 9BS || Scania Brazil
|-
| 9BU ||Gurgel Motores S.A. (defunct Brazilian automaker)
|-
| 9BV || Volvo Trucks Brazil
|-
| 9BW || Volkswagen Brazil
|-
| 9BY || Agrale S.A.
|-
| 9C2 || Moto Honda Da Amazonia Ltda.
|-
| 9C6 || Yamaha Motor Da Amazonia Ltda.
|-
| 9CD || Suzuki (motorcycles) assembled by J. Toledo Motos do Brasil
|-
| 9DF || Puma
|-
| 9DW || Kenworth & Peterbilt trucks [incomplete vehicle] made by Volkswagen do Brasil
|-
| 9EZ || homemade or handbuilt vehicles
|-
| 92H || Origem Brazil
|-
| 932 || Harley-Davidson Brazil
|-
| 935 || Citroën Brazil
|-
| 936 || Peugeot Brazil
|-
| 937 || Dodge Dakota
|-
| 93C || Chevrolet SUV [Tracker] or pickup [Tornado, Montana, S10] (sold in Mexico, made in Brazil)
|-
| 93H || [[../Honda/VIN Codes|Honda]] Brazil car/SUV
|-
| 93K || Volvo Trucks Brazil
|-
| 93P || Volare
|-
| 93S || Navistar International
|-
| 93R || [[../Toyota/VIN Codes|Toyota]] Brazil
|-
| 93U || Audi Brazil 1999–2006
|-
| 93W || Fiat Ducato made by Iveco 2000–2016
|-
| 93V || Navistar International
|-
| 93X || Souza Ramos – Mitsubishi Motors / Suzuki Jimny
|-
| 93Y || Renault Brazil
|-
| 93Z || Iveco
|-
| 94D || Nissan Brazil
|-
| 94N || RWM Brazil
|-
| 94T || Troller Veículos Especiais
|-
| 95P || CAOA Hyundai & CAOA Chery
|-
| 95V || Dafra Motos (motorscooters from SYM) & Ducati, KTM, & MV Agusta assembled by Dafra
|-
| 95V || BMW motorcycles assembled by Dafra Motos 2009–2016
|-
| 95Z || Buell Motorcycle Company assembled by Harley-Davidson Brazil
|-
| 953 || VW Truck & Bus / MAN Truck & Bus
|-
| 96P || Kawasaki
|-
| 97N || Triumph Motorcycles Ltd.
|-
| 988 || Jeep, Ram [Rampage], and Fiat [Toro] (made at the Goiana plant)
|-
| 98M || BMW car/SUV
|-
| 98P || DAF Trucks
|-
| 98R || Chery
|-
| 99A || Audi 2016-
|-
| 99H || Shineray
|-
| 99J || Jaguar Land Rover
|-
| 99K || Haojue & Kymco assembled by JTZ Indústria e Comércio de Motos
|-
| 99L || BYD
|-
| 99Z || BMW Motorrad (Motorcycle assembled by BMW 2017-)
|-
| 9FB || Renault Colombia (Sofasa)
|-
| 9FC || Compañía Colombiana Automotriz S.A. (Mazda)
|-
| 9GA || [[../GM/VIN Codes|Chevrolet]] Colombia (GM Colmotores S.A.)
|-
| 9UJ || Chery assembled by Chery Socma S.A. (Uruguay)
|-
| 9UK || Lifan (Uruguay)
|-
| 9UT || Dongfeng trucks made by Nordex S.A.
|-
| 9UW || Kia made by Nordex S.A.
|-
| 9VC || Fiat made by Nordex S.A. (Scudo, 2025 Titano)
|-
| 9V7 || Citroen made by Nordex S.A. (Jumpy)
|-
| 9V8 || Peugeot made by Nordex S.A. (Expert)
|}
==References==
{{reflist}}
{{BookCat}}
dwtaikcpb9u4q3wk8ima33tc4jwt8z6
Chess Opening Theory/1. d4/1...c6
0
148548
4669671
4668939
2026-09-11T11:20:20Z
Greenman
7490
Rejected the last 3 text changes (by [[Special:Contributions/~2026-48234-29|~2026-48234-29]]) and restored revision 4520019 by JCrue
4669671
wikitext
text/x-wiki
{{Chess Opening Theory/Position
|Queen's Pawn opening
|moves=1.d4 c6
|eco=[[Chess/ECOA|A40]]
|parent=[[../|Queens Pawn Opening]]
}}
== 1...c6 ==
'''1...c6''' is a transpositional tool. Black gives White the option of changing their mind and playing an e4 opening instead.
After [[/2. c4|'''2. c4''']], Black can play 2...d5 and transpose into a [[Chess Opening Theory/1. d4/1...d5/2. c4/2...c6|Slav defence]], as if they had played 1. d4 d5 2. c4 c6.
With this move order, White has the option of [[/2. e4|'''2. e4''']], where 2...d4 will transpose into a [[Chess Opening Theory/1. e4/1...c6/2. d4/2...d5|Caro-Kann]], as if they had played 1. e4 c6 2. d4 d5.
However, if White plays something else, like '''2. Bf4''', going for a [[Chess Opening Theory/1. d4/1...d5/2. Bf4|Accelerated London]]-style set-up where Black might like to play ...c5 at some point, they may regret having given up a tempo on ...c6 now.
==Theory table==
{{Chess Opening Theory/Table}}
'''1. d4 c6 '''
<table border="0" cellspacing="0" cellpadding="4">
<tr>
<th></th>
<th align="left">2</th>
<th align="left">3</th>
<th align="left">4</th>
<th align="left">5</th>
<th align="left">6</th>
<th align="left">7</th>
</tr>
<tr>
<th align="right">[[Chess/Slav Defence|Slav Defence]]</th>
<td>[[/2. c4|c4]]<br>d5</td>
<td>Nf3<br>Nf6</td>
<td>Nc3<br>dxc4</td>
<td>a4<br>Bf5</td>
<td>e3<br>e6</td>
<td>Bxc4<br>Bb4</td>
<td>=</td>
</tr>
<tr>
<th align="right">[[Chess/Caro-Kann Defence|Caro-Kann Defence]]</th>
<td>[[/2. e4|e4]]<br>d5</td>
<td>Nc3<br>dxe4</td>
<td>Nxe4<br>Bf5</td>
<td>Ng3<br>Bg6</td>
<td>Nf3<br>Nd7</td>
<td>h4<br>h6</td>
<td>=</td>
</tr>
</table>
{{ChessMid}}
{{wikipedia|Queen's Pawn}}
==References==
{{reflist}}
===See also===
{{BCO2}}
{{NCO}}
{{Chess Opening Theory/Footer}}
ptzxbx76jwdnhx6yizuufvysoqq0l3f
Prealgebra for Two-Year Colleges/Workbook AIE/Proportional reasoning
0
152401
4669569
3269428
2026-09-10T12:49:13Z
WereSpielChequers
248949
typo
4669569
wikitext
text/x-wiki
The material below was taken from [http://en.wikipedia.org/wiki/Proportional_reasoning]. It needs to be put into workbook form.
----
'''Proportional Reasoning'''
Proportionality is a mathematical relation between two quantities. Proportional reasoning is one of the skills a child acquires when progressing from the stage of concrete operations to the stage of formal operations according to [http://en.wikipedia.org/wiki/Jean_Piaget Piaget's] theory of intellectual development.
==What is Proportionality?==
“In mathematics and in physics, proportionality is a mathematical relation between two quantities.” There are two different views of this “mathematical relation”; one is based on ratios and the other is based on functions.
===An Arithmetic Viewpoint===
In many school books proportionality is expressed as an equality of two ratios:
:<math>\frac{a}{b} = \frac{c}{d}</math>
Given the values of any three of the terms, it is possible to solve for the fourth term. Once a student has mastered this arithmetic skill, one is tempted to think the student understands proportional reasoning. However, experimental evidence indicates that may not be the case.{{fact}}
===A Functional Viewpoint===
A scientist has a much different view of proportionality. Given the following equation for the force of gravity (according to Newton)
:<math>F = G \frac{m_1 m_2}{r^2}</math>
the scientist would say that the force of gravity between two masses is directly proportional to the product of the two masses and inversely proportional to the square of the distance between the two masses. From this perspective proportionality is a functional relationship between variables in a mathematical equation.
==Proportional Reasoning and Intellectual Development==
In Piaget’s model of intellectual development, the fourth and final stage is the [http://en.wikipedia.org/wiki/formal_operational_stage formal operational stage]. In the classic book “The Growth of Logical Thinking from Childhood to Adolescence” by [http://en.wikipedia.org/wiki/Jean_Piaget Jean Piaget] and [http://en.wikipedia.org/wiki/Barbel_Inhelder Barbel Inhelder] formal operational reasoning takes many forms, including propositional reasoning, deductive logic, separation and control of variables, combinatorial reasoning, and propositional reasoning. [http://en.wikipedia.org/wiki/Robert_Karplus Robert Karplus], a world-renowned science educator in the 1960s and 1970s, investigated all these forms of reasoning in adolescents and adults, but he is perhaps best known for his study of proportional reasoning.
==The Mr. Tall-Mr. Short Problem of [http://en.wikipedia.org/wiki/Robert_Karplus Robert Karplus]==
===Problem Statement===
Here is a picture of Mr. Tall and Mr. Short.
[[Image:MrShortMrTall.JPG|400px|Image of Mr. Tall and Mr. Short.]]
Mr. Short is six paper clips in height. If he is measured in large buttons he is four large buttons in height.
Mr. Tall is similar to Mr. Short but is six large buttons in height.
Predict the height of Mr. Tall if you could measure him in paper clips. Explain your response.
===Typical Solutions===
Multiplicative Reasoning 1:
“He is nine paper clips tall. Each button is equal to one and a half paper clips. If he is six buttons tall you multiply six time one and a half to get nine paper clips.”
Multiplicative Reasoning 2:
“Mr. Tall is 1 ½ times as high as Mr. Short. Since Mr. Short is 6 clips high, Mr. Tall must be 6 * 1 ½ = 9 clips high.”
Multiplicative Reasoning using addition:
“For every two buttons there are three paper clips. Mr. Tall is 2 buttons taller than Mr. Short so he must be 3 paper clips taller. 6 + 3 = 9 paper clips.”
Additive Reasoning 1:
“Mr. Tall is 8 paper clips high. Mr. Short is 4 large buttons high and 6 paper clips high. So the buttons are 2 less than the paper clips. Since Mr. Tall and Mr. Short are similar, and Mr. Tall is 6 buttons high, he must be 8 paper clips high.”
Additive Reasoning 2:
“Mr. Tall is two more buttons taller than Mr. Short so he will also be two more paper clips taller than Mr. Short resulting in 8 paper clips.”
Estimate:
“Nine, I figured he would be a bit taller.”
Haphazard:
“Since Mr. Tall is 2 more buttons than Mr. Short, I took the 6 paper clips and multiplied by 2 to get 12 paper clips.”
For the adolescent or adult who has not attained formal operational reasoning yet, the additive solution is by far the most common. It is a consistent, logical strategy, albeit incorrect, and for the values involved in the problem it produces a believable answer. This does not appear to be a problem with arithmetic skills, rather it is the application of an incorrect strategy.
===Inverse Proportion===
Comparable reasoning patterns exist for inverse proportion. Consider a container of colored liquid inside a right triangle where the triangle can be tilted and the water levels on the left and right side can be measured on a built-in scale. We call this a “water triangle.”
[[Image:Water-triangle.JPG |400px|The Water Triangle.]]
===Problem Statement and Typical Solutions===
Rotate your water triangle until you get a measurement of 4 units on the left side and 6 units on the right side.
Suppose the triangle is tilted even more until the water level on the right side is at 8 units. Predict what the water level in units will be on the left side.
Someone with knowledge about the area of triangles might reason: “Initially the area of the water forming the triangle is 12 since ½ * 4 * 6 = 12. The amount of water doesn’t change so the area won’t change. So the answer is 3 because ½ * 3 * 8 = 12.”
A correct multiplicative answer is relatively rare. By far the most common answer is something like: “2 units because the water level on the right side increased by two units so the water level on the left side must decrease by two units and 4 – 2 = 2.” Less frequently the reason for two units is: “Before there is a total of 10 units because 4 + 6 = 10. The total number of units must stay the same so the answer is 2 because 2 + 8 = 10.”
So again we see individuals who are not at the formal operational level apply an additive strategy to solve an inverse proportion rather than a multiplicative strategy. And, like the direct proportion, this incorrect strategy appears to be logical to the individual and appears to give a reasonable answer. Students are very surprised when they actually carry out the experiment and tilt the triangle to find the answer is 3 and not 2 as they so confidently predicted.
===Viewing These Strategies as Functional Relations===
Let T be the height of Mr. Tall and S be the height of Mr. Short, then the correct multiplicative strategy can be expressed as T/S = 3/2; this is a constant ratio relation. The incorrect additive strategy can be expressed as T – S = 2; this is a constant difference relation. Here is the graph for these two equations. For the numeric values involved in the problem statement, these graphs are “similar” and it is easy to see why individuals consider their incorrect answers perfectly reasonable.
[[Image:Tall-short-graph.JPG |400px|The Constant Ratio and Constant Difference Relations.]]
Now consider our inverse proportion using the “water triangle.” Let L be the height of the water on the left side and R be the height of the water on the right side, then the correct multiplicative strategy can be expressed as L * R = 24; this is a constant product relation. The incorrect additive strategy can be expressed as L + R = 10; this is a constant sum relation. Here is the graph for these two equations. For the numeric values involved in the problem statement, these graphs are “similar” and it is easy to see why individuals consider their incorrect answers perfectly reasonable.
[[Image:Left-right-graph.JPG |400px|The Constant Product and Constant Sum Relations.]]
==Teaching for Proportional Reasoning==
As any experienced teacher will attest, it is not sufficient to simply tell a student his/her answer is incorrect and then instruct the student to use the correct solution. The incorrect strategy has not been “unwired in the brain” and would re-emerge after the current lesson has been completed.
Also the additive strategies noted above cannot simply be labeled as “incorrect” since they do correctly match other real world situations. For example, consider the following problem:
On Independence Day this year Mr. Tall was 6 years old and Mr. Short was 4 years old. On a future Independence Day Mr. Short is 6 years old. How old will Mr. Tall be on that Independence Day?
Similarly the constant sum relation can be correct for some situations. Consider the following problem.
There are four beavers on the left side of a river and six beavers on the right side of the river. At a later time with the same group of beavers there are eight beavers on the right side of the river. How many beavers will there be on the left side?
So there are situations where the additive relations (constant difference and constant sum) are correct and other situations where the multiplicative relations (constant ratio and constant product) are correct.
===Use of Hands-On Activities and Karplus’ Learning Cycle===
It is critically important that students on their own recognize that their current mode of reasoning, say that it is additive, is inappropriate for a multiplicative problem they are trying to solve. [http://en.wikipedia.org/wiki/Robert_Karplus Robert Karplus] developed a model of learning he called the learning cycle that facilitates the acquisition of new reasoning skills.
1) The first phase is one of exploration in which students learn through their own actions and reactions with minimal guidance. The learning environment has to be carefully designed to focus student’s attention on the relevant issues. Learners may experience some cognitive dissonance if they discover their pre-existing strategy does not match observed results. This may lead to questions that they cannot answer with their present ideas or reasoning patterns.
2) In the second phase the concept is introduced and explained. Here the teacher is more active, and learning is achieved by explanation.
3) Finally, in the third phase, the concept is applied to new situations and its range of applicability is extended. Learning is achieved by repetition and practice so that new ideas and ways of thinking have time to stabilize.
Hands-on activities are extremely useful in the learning cycle. After making predictions about the height of Mr. Tall in paper clips, the measuring tools can be introduced and the students can test their strategies. For the student using a constant difference relation, actual measurement will show that Mr. Tall is actually nine paper clips high and this will set up some cognitive dissonance.
The same is true for the inverse relations. Here is a picture of two students working with the “water triangle.” Given the problem noted above, most students predict the water level on the left side will drop to two units when the water triangle is tilted. When they carry out the experiment and see that the answer is 3 units, this establishes some cognitive dissonance. This is a prime time for the teacher to move the lesson into the second stage of the learning cycle.
[[Image:Constant-product.png |400px|Students using the Water Triangle.]]
It is important that the students not over apply the multiplicative strategies they learn. Therefore some of the hands-on activities might not be based on a multiplicative relation. Here is a picture of two students working with an apparatus where the constant sum relation is correct.
[[Image:Constant-sum.png |400px|The constant sum relation works here.]]
It is not always possible or feasible to put carefully designed hands-on activities into the hands of students. Also, older audiences do not always react well to using hands-on experimentation. However, it is often possible to introduce cognitive dissonance through thought experiments.
===Determining a Correct Relation Based on Thought Experiments===
In all the experiments noted above there are two variables whose values change based on a fixed relation. Consider the following problem that is similar to the Mr. Tall and Mr. Short problem.
Here is a photograph of a father and a daughter. In this picture the daughter is 4 cm high and the father is 6 cm high. They decided to enlarge the picture and in the bigger picture the daughter is 6 cm high. How high is the father in the larger picture?
A very common answer for an individual using an additive relation is 8 cm because the father is always 2 cm higher than his daughter. So now ask this student the following question:
Suppose they made a very small version of the original picture and in this small picture the father is 2 cm high. How high will the daughter be in this small picture?
The student quickly realizes that the strategy “the father is always 2 cm higher than his daughter” is not correct. This can also be achieved by exploring the other extreme where the original picture is blown up to poster size and the daughter is 100 cm high. How high will the father be in this poster? A student answering 102 cm realizes that the father and daughter are almost the same height which cannot be right. Once cognitive dissonance is present, the teacher can introduce the correct relation, constant ratio.
The student can also be encouraged to conduct their own thought experiments, such as “what if the height of the daughter doubles in an enlargement, what will happen to the height of the father?” Most students, including those still at the concrete operational stage, will quickly answer that the father’s height must also double. The abstract thought experiment is: “Suppose that one of the variables is doubled in value, how will the other variable change?” If the answer is “double”, then this may be a constant ratio problem. But if the answer is not double, such as for the age problem with Mr. Tall and Mr. Short given above, then it is not a constant ratio problem.
For inverse relations, such as the “water triangle”, limiting cases can also introduce cognitive dissonance. For example, given the initial conditions with the water level on the left at 4 units and the water level on the right at 6 units, ask what the water level on the left would be if the triangle is tilted until the water level on the right is 10 units. Students will abandon the additive strategy at this point realizing that 0 cannot be the correct answer. A thought experiment can be performed for inverse relations. If one variable doubles in value, what happens to the other variable? If the answer is ½ then this might be a constant product relation (that is, an inverse proportion).
Plotting the values of variables can also be a valuable tool for identifying whether two variables are directly proportional or not. If they are directly proportional, then the values should be on a straight line and that line should intersect the origin.
==Expanding Functional Reasoning==
The four functional relations noted above, constant sum, constant difference, constant product, and constant ratio, are based on the four arithmetic operations students are most familiar with, namely, addition, subtraction, multiplication and division. Most relations in the real world do not fall into one of these categories. However, if students learn simple techniques such as thought experiments and plotting graphs, they will be able to apply these techniques to more complex situations.
Again, consider Newton’s equation for the force of gravity:
:<math>F = G \frac{m_1 m_2}{r^2}</math>
If a student understands the functional relation between the variables, then he/she should be able to answer the following thought experiments.
What would happen to the force of gravitational attraction if:
*one of the masses is doubled?
*one mass doubled and the other mass halved?
*both masses doubled?
*both masses halved?
*the distance between the masses doubled?
*the distance between the masses halved?
A final word of caution: thought experiments must be confirmed by experimental results. Consider the following variables: the mass of an object and the velocity with which it falls to the earth. Many children and adults when asked to perform a thought experiment might say that when the mass is doubled then the object will fall twice as fast. However, experimental results do not back up this “logical” thought experiment. So it is always essential that theoretical results agree with experimental data.
{{BookCat}}
8w1hisjoh3jd6b375b2t41w17p4ega4
Basic Geography/Atmosphere
0
193633
4669626
3827072
2026-09-10T18:38:11Z
Gasparfs
3625646
Fixed a few gramatical errors and rephrased a few expressions
4669626
wikitext
text/x-wiki
The atmosphere is the layer of air surrounding Earth, on which all life depends on. It can be living (biotic) or non-living (abiotic) things.
== Structure of the atmosphere ==
The atmosphere is divided into four layers: the troposphere, stratosphere, mesosphere and thermosphere, classified by temperature. In each layer, the temperature is either increasing or decreasing as the height above Earth's surface increases.
== Composition of the troposphere ==
The troposphere consist of a number of different permanent and variable gases. Permanent gases occur in fixed amounts. In this part of the atmosphere is where weather is usually experienced.
The permanent gases include:
* Nitrogen: 78%
* Oxygen: 21%, the gas humans use for respiration
* Argon: 1%
* Carbon dioxide: 0.04%, for plant growth
{{bookcat}}
i74if72ovdoinafwlmsswy0sf20hjqr
Structural Biochemistry/Cell Signaling Pathways/Circulatory Systems
0
216356
4669624
3641765
2026-09-10T17:55:08Z
WereSpielChequers
248949
c/e
4669624
wikitext
text/x-wiki
The circulatory system is made up of the vessels and the muscles which help and control the flow of the blood around the body. The main components of the circulatory system are the heart, the blood and the blood vessels. It also includes the pulmonary circulation, a loop through the lungs for the blood to be oxygenated and the systemic circulation.
It serves to move blood to a site or sites where it can be oxygenated, and where wastes can be disposed. Circulation then serves to bring newly oxygenated blood to the tissues of the body. The waste produces diffuse into the blood cells to be carried away, when oxygen and other chemicals spread out of the blood cells and into the fluid surrounding the cells of the body's tissues. Blood circulates through organs where wastes are removed, and back to the lungs for a fresh dose of oxygen, and then the process repeats itself.
Open Circulatory Systems
In higher animals, there are two primary types of circulatory systems -- open and closed. In an open circulatory system, blood leaves the blood and flows freely within the tissues. There is neither a true heart nor capillaries as are found in humans. Instead, there are blood vessels that act as pumps to force the blood along. Instead of capillaries, blood vessels join directly with open sinuses. A fluid called hemolymph, is forced from the blood vessels into large sinuses, where it actually baths the internal organs. Other vessels receive blood forced from these sinuses and conduct it back to the pumping vessels. This is a very inefficient system. Insects can get by with this type system because they have numerous openings in their bodies that allow the "blood" to come into contact with air.
Closed Circulatory Systems
The closed circulatory system separates the tissue fluid from blood. The blood is pumped through a closed system of arteries, veins, and capillaries. Capillaries surround the organs, making sure that all cells have an equal opportunity for nourishment and removal of their waste products.
The simplest type of closed circulatory systems is an earthworm. Earthworms have two main blood vessels, a dorsal and a ventral vessel, which carry blood towards the head or the tail. Blood is moved along the dorsal vessel by waves of contraction in the wall of the vessel. In the anterior region of the worm, there are five pairs of vessels, that connect the dorsal and the ventral vessels. These connecting vessels function as basic hearts and force the blood into the ventral vessel. There are also special organs in the earthworm for the removal of nitrogenous wastes. Still, blood can flow backward and the system is only slightly more efficient than the open system of insects.
The closed circulatory system has more advantages over the open circulatory system.
1. The blood transfers faster in the closed system, thus oxygen, nutrients, and wastes transport fast also.
2. Specialized cells help carry nutrients.
3. The blood and the tissue fluid are distinguished easily.
{{BookCat}}
e3d62ichfs7gjlte915prn1yafeou6g
VCE Specialist Mathematics/Units 3 and 4: Specialist Mathematics/Common Math Hacks
0
223428
4669562
3589535
2026-09-10T12:06:31Z
~2026-48820-20
3625622
/* Complex Numbers */
4669562
wikitext
text/x-wiki
<noinclude>
{{Simple Page Navigation|
BookName=[[VCE Specialist Mathematics]]|
CurrentPage=Common Math Hacks|
PrevPage=[[VCE Specialist Mathematics/Units 3 and 4: Specialist Mathematics/Practice Exams|Practice Exams]]|
NextPage=[[VCE Specialist Mathematics/Units 3 and 4: Specialist Mathematics/Common Exam Mistakes|Common Exam Mistakes]]}}
</noinclude>
== Preface ==
This page serves to categorize and organize commonly used mathematical hacks, which allow their users to complete questions faster, and with a greater deal of accuracy.
== Units 3 and 4: Specialist Mathematics ==
=== Coordinate Geometry ===
==== Ellipses, Hyperbolas ====
The values <math>a</math> and <math>b</math> can be fractional, as can be seen by taking the following equation:
* <math>\frac{4(x)^2}{1} + \frac{16(y)^2}{1} = 1</math> where <math> a = \frac{1}{2}, b = \frac{1}{4}</math>
Equations found in questions may not be in the general form, and may need to be transformed via the complete the square method::
==== Circles ====
Equations found in questions may not be in the general form, and may need to be transformed via the complete the square method, in conjunction with extricating all variables from under root symbols; an example follows:
(x-h)^2 + (y-k)^2 = r^2
Notice how the centre for this circle is (h,k) because a translation h right and k up has been made. Because y is on the same side as x, the translations are opposite in sign as a result.
All loci are a fixed distance from the centre point: (h,k)
=== Complex Numbers ===
=== Relations and Regions in the Complex Plane ===
=== Differential Calculus ===
=== Integral Calculus ===
=== Differential Equations ===
=== Kinematics ===
=== Vectors ===
=== Vector Calculus ===
=== Mechanics ===
{{BookCat}}
8ixz7znzcywwi0om1t3s82jpu54uhzf
How to Think Like a Computer Scientist: Learning with Python 2nd Edition/Customizing and Contributing to the Book
0
225746
4669619
4666205
2026-09-10T17:49:00Z
WereSpielChequers
248949
typo
4669619
wikitext
text/x-wiki
= Customizing and Contributing to the Book =
<blockquote>''Note:'' the following instructions assume that you are connected to the Internet and that you have both the <code>main</code> and <code>universe</code> package repositories enabled. All unix shell commands are assumed to be running from your home directory ($HOME). Finally, any command that begins with <code>sudo</code> assums that you have administrative rights on your machine. If you do not --- please ask your system administrator about installing the software you need.
</blockquote>
This book is free as in freedom, which means you have the right to modify it to suite your needs, and to redistribute your modifications so that our whole community can benefit.
That freedom lacks meaning, however, if you the tools needed to make a custom version or to contribute corrections and additions are not within your reach. This appendix attempts to put those tools in your hands.
Thanks!
[mailto:jeff@elkner.net Jeffrey Elkner]_<br />
Governor's Career and Technical Academy in Arlington<br />
Arlington, Virginia
== Getting the Source ==
This book is [http://en.wikipedia.org/wiki/Markup_language marked up] in [http://en.wikipedia.org/wiki/ReStructuredText ReStructuredText] using a document generation system called [http://en.wikipedia.org/wiki/Sphinx_%28documentation_generator%29 Sphinx].
The source code is located on the [http://en.wikipedia.org/wiki/Launchpad_%28website%29 Launchpad website] at http://bazaar.launchpad.net/~thinkcspy/thinkcspy/english2e/files.
The easiest way to get the source code on an Ubuntu 9.10 computer is:
# run <code>sudo apt-get install bzr</code> on your system to install [http://en.wikipedia.org/wiki/Bazaar_%28software%29 bzr].
# run <code>bzr branch lp:thinkcspy</code>.
The last command above will download the book source from Launchpad into a directory named <code>thinkcspy</code> which contains the Sphinx source and configuration information needed to build the book.
== Making the HTML Version ==
To generate the html version of the book:
# run <code>sudo apt-get install python-sphinx</code> to install the Sphinx documentation system.
# <code>cd thinkcspy</code> - change into the <code>thinkcspy</code> directory containing the book source.
# <code>make html</code>.
The last command will run sphinx and create a directory named <code>build</code> containing the html version of the text.
<blockquote>''Note'': Sphinx supports building other output types as well, such as [[w:PDF|PDF]]. This requires that [[LaTeX]] be present on your system. Since I only personally use the html version, I will not attempt to document that process here.
</blockquote>
{{BookCat}}
j83oe2g8djgfcl8m0bikdpdiby7jr8b
The Linux Kernel/Networking
0
226986
4669561
4669560
2026-09-10T12:06:16Z
Conan
3188
net/core: group files by subsystem
4669561
wikitext
text/x-wiki
<noinclude>{{DISPLAYTITLE:Network functionality}}</noinclude>
{|style="width: 25%; float: right; text-align:center;border-spacing: 0; color:black; margin:auto;" cellpadding=5pc
! bgcolor="#dff" |networking
|-
| bgcolor="#bff" |[[#Sockets|sockets access]]
|-
| bgcolor="#adf" |[[#Address_families|address families: inet, unix, ...]]
|-
| bgcolor="#9cd" |[[#Network_storage|network storage]]
|-
| bgcolor="#8bb" |[[#Protocols|protocols]]
|-
| bgcolor="#7a9" |[[#Network_device_interfaces|network interfaces]]
|-
| bgcolor="#798" |[[#Network_drivers|network drivers]]
|}
Linux kernel network functionality spans from sockets interface through protocols to network cards.
⚲ Shell interfaces:
: {{The Linux Kernel/man|8|netstat}} prints network connections, routing tables, interface statistics and other details
: {{The Linux Kernel/man|8|ip}} shows and configures routing, network devices, interfaces and tunnels
: {{The Linux Kernel/man|8|ss}} - socket statistics utility
== Sockets ==
⚲ API:
[https://man7.org/linux/man-pages/man0/sys_socket.h.0p.html sys/socket.h – main user mode sockets header]
Basic common and client side interface:
: {{The Linux Kernel/man|2|socket}} ↪ {{The Linux Kernel/id|__sys_socket}} creates an endpoint for communication
: struct {{The Linux Kernel/id|sockaddr}} - abstract socket address
: {{The Linux Kernel/man|2|connect}} ↪ {{The Linux Kernel/id|__sys_connect}};
: {{The Linux Kernel/man|2|shutdown}} shuts down part of a full-duplex connection
: {{The Linux Kernel/man|2|send}} ↪ {{The Linux Kernel/id|__sys_sendto}} sends a message on a socket
: {{The Linux Kernel/man|2|recv}} ↪ {{The Linux Kernel/id|__sys_recvfrom}}, {{The Linux Kernel/id|__sys_recvmsg}} receives a message from a socket
: {{The Linux Kernel/man|2|setsockopt}}, {{The Linux Kernel/man|2|getsockopt}} ↪ {{The Linux Kernel/id|__sys_setsockopt}} – set/get socket options
: {{The Linux Kernel/man|2|socketpair}} ↪ {{The Linux Kernel/id|__sys_socketpair}} – create a pair of connected sockets
Additional server side interface:
: {{The Linux Kernel/man|2|bind}} ↪ {{The Linux Kernel/id|__sys_bind}} - binds a sockaddr to a socket
: {{The Linux Kernel/man|2|listen}} ↪ {{The Linux Kernel/id|__sys_listen}} - listens for connections on a socket
: {{The Linux Kernel/man|2|accept}} ↪ {{The Linux Kernel/id|__sys_accept4}} - accepts a connection on a socket
⚙️ Internals
: struct '''{{The Linux Kernel/id|socket}}''' @ {{The Linux Kernel/include|linux/net.h}} contains
:: struct {{The Linux Kernel/id|proto_ops}} - abstract protocols interface
:: struct {{The Linux Kernel/id|sock}} - network layer representation of sockets {{The Linux Kernel/include|net/sock.h}}
: '''{{The Linux Kernel/id|__sys_socket}}''' ↯ call hierarchy:
:: {{The Linux Kernel/id|sock_create}}
::: {{The Linux Kernel/id|__sock_create}}
:::: {{The Linux Kernel/id|security_socket_create}}
:::: {{The Linux Kernel/id|sock_alloc}}
::::: {{The Linux Kernel/id|net_proto_family}}->create.
:::::: for example {{The Linux Kernel/id|inet_create}}. See [[#Address_families|Address families]] for other options.
: '''{{The Linux Kernel/id|__sys_connect}}''' ↯ call hierarchy:
:: {{The Linux Kernel/id|move_addr_to_kernel}}
::: {{The Linux Kernel/id|audit_sockaddr}}
::: {{The Linux Kernel/id|__sys_connect_file}}
:::: {{The Linux Kernel/id|sock_from_file}}
:::: {{The Linux Kernel/id|security_socket_connect}}
:::: {{The Linux Kernel/id|proto_ops}}->connect.
::::: for example {{The Linux Kernel/id|inet_stream_connect}}. See [[#Protocols|Protocols]] for other options.
: {{The Linux Kernel/source|net/socket.c}} – socket system calls implementation
: {{The Linux Kernel/source|net/core/sock.c}} – {{The Linux Kernel/id|sock}} core: allocation, options, buffer management
📚 References
: {{The Linux Kernel/man|7|socket}}
: {{The Linux Kernel/include|linux/socket.h}}
: {{w|Berkeley sockets}}
🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dsock stress-ng --sock],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dsockpair --sockpair]
== Network storage ==
🚀 advanced topic
🔧 TODO
⚲ API:
: {{The Linux Kernel/man|2|sendfile}} ↪ {{The Linux Kernel/id|do_sendfile}}.
See also [[../Storage#Zero-copy|Zero-copy between file descriptors]]
:{{w|Application layer|Application layer}}: {{w|Network File System}}
: {{The Linux Kernel/doc|NFS|filesystems/nfs}}, {{The Linux Kernel/include|linux/nfs_fs.h}}, {{The Linux Kernel/source|fs/nfs}}
:: {{The Linux Kernel/id|init_nfs_fs}}, {{The Linux Kernel/id|nfs4_fs_type}}, {{The Linux Kernel/id|nfs_fs_type}},
:: {{The Linux Kernel/id|init_nfsd}}, {{The Linux Kernel/id|nfsd_fs_type}}
: {{The Linux Kernel/doc|CIFS|admin-guide/cifs}}
:: {{The Linux Kernel/id|init_cifs}}
:: {{The Linux Kernel/id|cifs_fs_type}}, {{The Linux Kernel/id|smb3_fs_type}} {{The Linux Kernel/id|cifs_smb3_do_mount}}
: {{The Linux Kernel/doc|target and iSCSI Interfaces Guide|driver-api/target.html}}
📚 Further reading
: https://deepwiki.com/torvalds/linux/4.3-network-filesystems-(cifssmb)
== Transport and Network ==
=== Names ===
⚲ API: {{The Linux Kernel/man|2|uname}}, {{The Linux Kernel/man|2|sethostname}}, {{The Linux Kernel/man|2|gethostname}}, {{The Linux Kernel/man|2|setdomainname}} {{The Linux Kernel/man|2|getdomainname}}
: ↪ {{The Linux Kernel/id|utsname}}
⚙️ Details
: {{The Linux Kernel/id|utsname}} returns writable pointer to {{The Linux Kernel/id|new_utsname}} from {{The Linux Kernel/id|uts_namespace}} from {{The Linux Kernel/id|nsproxy}} from {{The Linux Kernel/id|current}} {{The Linux Kernel/id|task_struct}}.
: {{The Linux Kernel/id|CLONE_NEWUTS}}, {{The Linux Kernel/id|setns}}
: {{The Linux Kernel/source|kernel/utsname.c}} – UTS namespace management
📚 References:
: {{The Linux Kernel/man|7|namespaces}}
: {{The Linux Kernel/man|7|network_namespaces}}
: {{The Linux Kernel/man|7|uts_namespaces}}
=== Address families ===
⚲ API
: {{The Linux Kernel/man|2|getsockname}}
: {{The Linux Kernel/man|2|getpeername}}
: Address Family (AF) <big>domain</big> defines address format and address length <big>socklen_t</big>.
: {{The Linux Kernel/man|3|inet_ntop}}, {{The Linux Kernel/man|3|inet_pton}} (derive socklen_t from AF)
Common AF: {{The Linux Kernel/id|AF_UNIX}}, {{The Linux Kernel/id|AF_INET}}, {{The Linux Kernel/id|AF_NETLINK}}.
''PF - Protocol Family index ({{The Linux Kernel/id|PF_MAX}}) actually is the same as Address Family index (AF).''
⚙️ Internals of some AF
: {{The Linux Kernel/man|7|unix}} ↪ {{The Linux Kernel/id|unix_family_ops}} - sockets for local IPC, {{The Linux Kernel/source|net/unix}}
:: {{The Linux Kernel/id|unix_create}}
: {{The Linux Kernel/man|7|ip}} ↪ {{The Linux Kernel/id|inet_family_ops}} - IPv4
:: {{The Linux Kernel/id|inet_create}}
: {{The Linux Kernel/man|7|netlink}} ↪ {{The Linux Kernel/id|netlink_family_ops}} - communication between kernel and user space, {{The Linux Kernel/source|net/netlink}}
:: {{The Linux Kernel/include|linux/netlink.h}}, {{The Linux Kernel/include|linux/rtnetlink.h}} – netlink and routing netlink messages
:: {{The Linux Kernel/id|netlink_create}}
:: 🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dnetlink%2Dproc stress-ng --netlink-proc]
: {{The Linux Kernel/man|7|vsock}} ↪ {{The Linux Kernel/id|vsock_family_ops}} - communication between VM and hypervisor
:: {{The Linux Kernel/id|vsock_create}}
: {{The Linux Kernel/man|7|packet}} ↪ {{The Linux Kernel/id|packet_family_ops}} - device level interface
:: {{The Linux Kernel/id|packet_create}}
: {{The Linux Kernel/id|bt_sock_family_ops}} - Bluetooth
:: {{The Linux Kernel/id|bt_sock_create}}
There are more than 40 AFs in total (see {{The Linux Kernel/id|AF_MAX}})
⚙️ Internals
: {{The Linux Kernel/id|sock_register}} - registers {{The Linux Kernel/id|net_proto_family}}. See references to this identifiers to find more than 30 protocol families.
: {{The Linux Kernel/id|__sock_create}}
📚 Further reading
: {{The Linux Kernel/man|8|ip-address}} – protocol address management
: {{w|Internet layer}}
: {{The Linux Kernel/man|7|address_families}}
=== Protocols ===
Each Protocol Family (PF, ''same index as Address Family AF'') consists of several protocol implementations.
Directory /proc/net contains various files and subdirectories containing information about the networking layer.
File /proc/net/protocols lists available and used protocols.
In each PF protocols are classified to different types {{The Linux Kernel/id|sock_type}}, for example stream, datagram and raw socket.
TCP is type of stream, UDP is type of datagram, raw and ping are type of raw.
: {{The Linux Kernel/id|proto_register}} - registers struct {{The Linux Kernel/id|proto}} - protocol implementations:
: In {{The Linux Kernel/id|inet_init}} initcall, {{The Linux Kernel/id|inetsw_array}}, {{The Linux Kernel/id|proto_ops}} and {{The Linux Kernel/id|proto}} :
:: {{The Linux Kernel/id|inet_stream_ops}} & {{The Linux Kernel/id|tcp_prot}} {{The Linux Kernel/id|tcp_sendmsg}} ...
:: {{The Linux Kernel/id|inet_dgram_ops}} & {{The Linux Kernel/id|udp_prot}} {{The Linux Kernel/id|udp_sendmsg}} ...
:: {{The Linux Kernel/id|inet_sockraw_ops}}
::: {{The Linux Kernel/id|raw_prot}} {{The Linux Kernel/id|raw_sendmsg}} ...
::: {{The Linux Kernel/id|ping_prot}} {{The Linux Kernel/id|ping_v4_sendmsg}} ...
: In {{The Linux Kernel/id|af_unix_init}} initcall:
:: {{The Linux Kernel/id|unix_family_ops}}
::: {{The Linux Kernel/id|unix_create}}
:::: {{The Linux Kernel/id|unix_stream_ops}} {{The Linux Kernel/id|unix_stream_sendmsg}} ...
:::: {{The Linux Kernel/id|unix_dgram_ops}} {{The Linux Kernel/id|unix_dgram_sendmsg}} ...
:::: {{The Linux Kernel/id|unix_seqpacket_ops}} {{The Linux Kernel/id|unix_seqpacket_sendmsg}} ...
⚙️ Internals:
: {{The Linux Kernel/include|linux/in.h}}, {{The Linux Kernel/include|linux/ip.h}} – IPv4 address, protocol and header definitions
: {{The Linux Kernel/source|net/ipv4}} – IPv4 protocol stack
:: {{The Linux Kernel/source|net/ipv4/af_inet.c}} – PF_INET socket family ({{The Linux Kernel/id|inet_family_ops}}, {{The Linux Kernel/id|inet_init}})
:: {{The Linux Kernel/source|net/ipv4/protocol.c}} – IPv4 protocol handler registration ({{The Linux Kernel/id|inet_add_protocol}})
:: {{The Linux Kernel/source|net/ipv4/ip_input.c}} – IPv4 receive path ({{The Linux Kernel/id|ip_rcv}}, {{The Linux Kernel/id|ip_local_deliver}})
:: {{The Linux Kernel/source|net/ipv4/ip_output.c}} – IPv4 transmit path ({{The Linux Kernel/id|ip_output}}, {{The Linux Kernel/id|ip_queue_xmit}})
:: {{The Linux Kernel/source|net/ipv4/ip_forward.c}} – IPv4 packet forwarding ({{The Linux Kernel/id|ip_forward}})
:: {{The Linux Kernel/source|net/ipv4/ip_fragment.c}} – fragmentation and reassembly ({{The Linux Kernel/id|ip_do_fragment}})
:: {{The Linux Kernel/source|net/ipv4/ip_options.c}} – IP options parsing and building
:: {{The Linux Kernel/source|net/ipv4/ip_sockglue.c}} – IP socket options ({{The Linux Kernel/id|ip_setsockopt}})
:: Addressing:
:: {{The Linux Kernel/source|net/ipv4/devinet.c}} – per-device IPv4 address management ({{The Linux Kernel/id|inetdev_init}})
:: {{The Linux Kernel/source|net/ipv4/arp.c}} – Address Resolution Protocol ({{The Linux Kernel/id|arp_rcv}}, {{The Linux Kernel/id|arp_send}})
:: Routing:
:: {{The Linux Kernel/source|net/ipv4/route.c}} – IPv4 route lookup and cache ({{The Linux Kernel/id|ip_route_output_key}}, {{The Linux Kernel/id|rtable}})
:: {{The Linux Kernel/source|net/ipv4/fib_frontend.c}} – FIB user interface: netlink and ioctl ({{The Linux Kernel/id|fib_table_lookup}})
:: {{The Linux Kernel/source|net/ipv4/fib_trie.c}} – LC-trie FIB implementation ({{The Linux Kernel/id|fib_trie_table}})
:: {{The Linux Kernel/source|net/ipv4/fib_semantics.c}} – FIB entry semantics: nexthop, scope, metrics
:: {{The Linux Kernel/source|net/ipv4/fib_rules.c}} – IPv4 routing policy rules (ip rule)
:: {{The Linux Kernel/source|net/ipv4/nexthop.c}} – generic nexthop objects (since 5.3, {{The Linux Kernel/id|nexthop_find_by_id}})
:: {{The Linux Kernel/source|net/ipv4/inetpeer.c}} – peer storage for per-destination state ({{The Linux Kernel/id|inet_getpeer}})
:: ICMP / IGMP:
:: {{The Linux Kernel/source|net/ipv4/icmp.c}} – ICMPv4 ({{The Linux Kernel/id|icmp_rcv}}, {{The Linux Kernel/id|icmp_send}})
:: {{The Linux Kernel/source|net/ipv4/igmp.c}} – Internet Group Management Protocol, MLDv1 ({{The Linux Kernel/id|ip_mc_join_group}})
:: {{The Linux Kernel/source|net/ipv4/ipmr.c}} – IPv4 multicast routing ({{The Linux Kernel/id|ipmr_mfc_add}})
:: Transport protocols:
:: {{The Linux Kernel/include|net/tcp.h}}, {{The Linux Kernel/source|net/ipv4/tcp.c}} – TCP core (connect, send, recv, close)
::: {{The Linux Kernel/id|tcp_sock}} – per-connection TCP state, {{The Linux Kernel/id|tcp_sk}} – cast from sock
::: {{The Linux Kernel/id|tcphdr}} – TCP header struct
::: {{The Linux Kernel/id|tcp_congestion_ops}} – pluggable congestion control ({{w|TCP congestion control|cubic, bbr, reno}})
:: {{The Linux Kernel/source|net/ipv4/tcp_ipv4.c}} – TCP over IPv4 ({{The Linux Kernel/id|tcp_v4_rcv}}, {{The Linux Kernel/id|tcp_prot}})
:: {{The Linux Kernel/source|net/ipv4/tcp_input.c}} – TCP receive processing ({{The Linux Kernel/id|tcp_rcv_established}}, ACK, SACK)
:: {{The Linux Kernel/source|net/ipv4/tcp_output.c}} – TCP transmit: segment building, retransmit ({{The Linux Kernel/id|tcp_write_xmit}})
:: {{The Linux Kernel/source|net/ipv4/tcp_timer.c}} – TCP timers: retransmit, keepalive, TIME_WAIT ({{The Linux Kernel/id|tcp_retransmit_timer}})
:: {{The Linux Kernel/source|net/ipv4/tcp_minisocks.c}} – TIME_WAIT and SYN_RECV mini sockets ({{The Linux Kernel/id|tcp_time_wait}})
:: {{The Linux Kernel/source|net/ipv4/tcp_fastopen.c}} – TCP Fast Open ({{The Linux Kernel/id|tcp_fastopen_cookie}}, since 3.6)
:: {{The Linux Kernel/source|net/ipv4/tcp_ao.c}} – TCP Authentication Option (RFC 5925, since 6.7)
:: {{The Linux Kernel/source|net/ipv4/tcp_metrics.c}} – per-destination TCP metrics cache
:: {{The Linux Kernel/source|net/ipv4/tcp_cong.c}} – congestion control framework ({{The Linux Kernel/id|tcp_register_congestion_control}})
:: {{The Linux Kernel/source|net/ipv4/tcp_cubic.c}} – CUBIC congestion control (default)
:: {{The Linux Kernel/source|net/ipv4/tcp_bbr.c}} – BBR congestion control (since 4.9)
:: {{The Linux Kernel/source|net/ipv4/syncookies.c}} – TCP SYN cookies ({{The Linux Kernel/id|cookie_v4_check}})
:: {{The Linux Kernel/source|net/ipv4/udp.c}} – UDP ({{The Linux Kernel/id|udp_rcv}}, {{The Linux Kernel/id|udp_prot}})
:: {{The Linux Kernel/source|net/ipv4/raw.c}} – raw IP sockets ({{The Linux Kernel/id|raw_prot}})
:: {{The Linux Kernel/source|net/ipv4/ping.c}} – ping socket / ICMP echo ({{The Linux Kernel/id|ping_prot}})
:: {{The Linux Kernel/source|net/ipv4/datagram.c}} – common UDP/RAW datagram helpers ({{The Linux Kernel/id|ip4_datagram_connect}})
:: Socket infrastructure:
:: {{The Linux Kernel/source|net/ipv4/inet_connection_sock.c}} – connection-oriented socket base ({{The Linux Kernel/id|inet_csk_accept}})
:: {{The Linux Kernel/source|net/ipv4/inet_hashtables.c}} – TCP/UDP socket hash table lookup ({{The Linux Kernel/id|inet_lookup_established}})
:: {{The Linux Kernel/source|net/ipv4/inet_timewait_sock.c}} – TIME_WAIT socket recycling
:: {{The Linux Kernel/source|net/ipv4/inet_fragment.c}} – generic IP fragment queue management
:: {{The Linux Kernel/source|net/ipv4/inet_diag.c}} – socket diagnostics via netlink (ss, {{The Linux Kernel/id|inet_diag_handler}})
:: Tunnels:
:: {{The Linux Kernel/source|net/ipv4/ip_tunnel.c}} – generic IP tunnel framework ({{The Linux Kernel/id|ip_tunnel_xmit}})
:: {{The Linux Kernel/source|net/ipv4/ip_gre.c}} – GRE over IPv4 (gre, gretap)
:: {{The Linux Kernel/source|net/ipv4/ipip.c}} – IP-in-IP tunnel (ipip)
:: {{The Linux Kernel/source|net/ipv4/ip_vti.c}} – virtual tunnel interface (vti, IPsec-aware)
:: {{The Linux Kernel/source|net/ipv4/fou_core.c}} – Foo-over-UDP encapsulation (since 3.18)
:: {{The Linux Kernel/source|net/ipv4/gre_demux.c}} – GRE protocol demultiplexer
:: {{The Linux Kernel/source|net/ipv4/tunnel4.c}} – IPv4 tunnel protocol registration
:: IPsec / XFRM:
:: {{The Linux Kernel/source|net/ipv4/xfrm4_policy.c}} – IPv4 IPsec policy ({{The Linux Kernel/id|xfrm4_dst_ops}})
:: {{The Linux Kernel/source|net/ipv4/xfrm4_state.c}} – IPv4 IPsec state management
:: {{The Linux Kernel/source|net/ipv4/xfrm4_input.c}} – IPv4 IPsec inbound processing
:: {{The Linux Kernel/source|net/ipv4/xfrm4_output.c}} – IPv4 IPsec outbound processing
:: {{The Linux Kernel/source|net/ipv4/ah4.c}} – Authentication Header (AH) for IPv4
:: {{The Linux Kernel/source|net/ipv4/esp4.c}} – Encapsulating Security Payload (ESP) for IPv4
:: {{The Linux Kernel/source|net/ipv4/ipcomp.c}} – IP Payload Compression (IPComp, RFC 3173)
:: Security:
:: {{The Linux Kernel/source|net/ipv4/cipso_ipv4.c}} – CIPSO Commercial IP Security Option ({{The Linux Kernel/id|cipso_v4_validate}})
:: sysctl / proc:
:: {{The Linux Kernel/source|net/ipv4/sysctl_net_ipv4.c}} – /proc/sys/net/ipv4/ tunables
:: {{The Linux Kernel/source|net/ipv4/proc.c}} – /proc/net/snmp and /proc/net/netstat statistics
:: {{The Linux Kernel/source|net/ipv4/netfilter}} – IPv4 netfilter hooks (see [[#Netfilter|Netfilter]])
: {{The Linux Kernel/include|linux/ipv6.h}} – IPv6 definitions
: {{The Linux Kernel/source|net/ipv6}} – IPv6 protocol stack
:: {{The Linux Kernel/source|net/ipv6/af_inet6.c}} – PF_INET6 socket family ({{The Linux Kernel/id|inet6_family_ops}}, {{The Linux Kernel/id|inet6_init}})
:: {{The Linux Kernel/source|net/ipv6/protocol.c}} – IPv6 protocol handler registration ({{The Linux Kernel/id|inet6_add_protocol}})
:: {{The Linux Kernel/source|net/ipv6/ip6_input.c}} – IPv6 receive path ({{The Linux Kernel/id|ipv6_rcv}}, {{The Linux Kernel/id|ip6_forward}})
:: {{The Linux Kernel/source|net/ipv6/ip6_output.c}} – IPv6 transmit path ({{The Linux Kernel/id|ip6_output}}, {{The Linux Kernel/id|ip6_xmit}})
:: {{The Linux Kernel/source|net/ipv6/ip6_checksum.c}} – UDP/TCP checksum over IPv6
:: {{The Linux Kernel/source|net/ipv6/ila}} – {{w|IPv6 address|Identifier Locator Addressing}} (ILA): address translation for scalable IPv6 overlays
:: {{The Linux Kernel/source|net/ipv6/netfilter}} – IPv6 netfilter hooks (see [[#Netfilter|Netfilter]])
:: Addressing:
:: {{The Linux Kernel/source|net/ipv6/addrconf.c}} – address autoconfiguration: SLAAC, DAD, RA handling ({{The Linux Kernel/id|addrconf_notify}})
:: {{The Linux Kernel/source|net/ipv6/addrconf_core.c}} – address scope helpers for static builds (no full IPv6 module)
:: {{The Linux Kernel/source|net/ipv6/ndisc.c}} – Neighbor Discovery Protocol ({{w|Neighbor Discovery Protocol|NDP}}, RFC 4861)
:: {{The Linux Kernel/source|net/ipv6/anycast.c}} – anycast address support
:: {{The Linux Kernel/source|net/ipv6/addrlabel.c}} – address label subsystem for source address selection (RFC 6724)
:: Routing:
:: {{The Linux Kernel/source|net/ipv6/route.c}} – IPv6 routing table lookup and route management ({{The Linux Kernel/id|ip6_route_output}}, {{The Linux Kernel/id|rt6_info}})
:: {{The Linux Kernel/source|net/ipv6/ip6_fib.c}} – IPv6 FIB trie ({{The Linux Kernel/id|fib6_table}}, {{The Linux Kernel/id|fib6_info}})
:: {{The Linux Kernel/source|net/ipv6/fib6_rules.c}} – IPv6 routing policy rules (ip rule)
:: {{The Linux Kernel/source|net/ipv6/ip6_flowlabel.c}} – flow label manager ({{The Linux Kernel/id|ip6_flowlabel}})
:: Extension headers:
:: {{The Linux Kernel/source|net/ipv6/exthdrs.c}} – extension header processing (hop-by-hop, routing, destination)
:: Transport protocols:
:: {{The Linux Kernel/source|net/ipv6/tcp_ipv6.c}} – TCP over IPv6 ({{The Linux Kernel/id|tcp_v6_rcv}}, {{The Linux Kernel/id|tcpv6_prot}}, {{The Linux Kernel/id|tcp_v6_syn_recv_sock}})
:: {{The Linux Kernel/source|net/ipv6/udp.c}} – UDP over IPv6 ({{The Linux Kernel/id|udpv6_prot}}, {{The Linux Kernel/id|udpv6_rcv}})
:: {{The Linux Kernel/source|net/ipv6/raw.c}} – raw sockets over IPv6
:: {{The Linux Kernel/source|net/ipv6/ping.c}} – ping socket ({{w|ICMPv6}} echo) over IPv6
:: {{The Linux Kernel/source|net/ipv6/datagram.c}} – common UDP/RAW datagram helpers ({{The Linux Kernel/id|ip6_datagram_connect}})
:: {{The Linux Kernel/source|net/ipv6/syncookies.c}} – TCP SYN cookie support for IPv6
:: {{The Linux Kernel/source|net/ipv6/reassembly.c}} – fragment reassembly ({{The Linux Kernel/id|ipv6_frag_rcv}})
:: ICMPv6:
:: {{The Linux Kernel/source|net/ipv6/icmp.c}} – ICMPv6 (RFC 4443): error messages, echo, {{The Linux Kernel/id|icmpv6_send}}
:: Multicast:
:: {{The Linux Kernel/source|net/ipv6/mcast.c}} – multicast group management, MLDv1/v2 ({{The Linux Kernel/id|ipv6_dev_mc_inc}})
:: {{The Linux Kernel/source|net/ipv6/ip6mr.c}} – IPv6 multicast routing ({{The Linux Kernel/id|ip6mr_table}})
:: {{The Linux Kernel/source|net/ipv6/mcast_snoop.c}} – MLD snooping for bridge integration
:: Tunnels:
:: {{The Linux Kernel/source|net/ipv6/ip6_tunnel.c}} – IPv6-in-IPv6 tunnel (ip6tnl)
:: {{The Linux Kernel/source|net/ipv6/ip6_gre.c}} – GRE over IPv6 (ip6gre, ip6gretap)
:: {{The Linux Kernel/source|net/ipv6/sit.c}} – IPv4-in-IPv6 Simple Internet Transition tunnel (sit)
:: {{The Linux Kernel/source|net/ipv6/ip6_vti.c}} – virtual tunnel interface over IPv6 (vti6, IPsec-aware)
:: {{The Linux Kernel/source|net/ipv6/ip6_udp_tunnel.c}} – UDP encapsulation helpers for IPv6 tunnels
:: {{The Linux Kernel/source|net/ipv6/fou6.c}} – Foo-over-UDP encapsulation for IPv6
:: IPsec / XFRM:
:: {{The Linux Kernel/source|net/ipv6/xfrm6_policy.c}} – IPv6 IPsec policy lookup ({{The Linux Kernel/id|xfrm6_dst_ops}})
:: {{The Linux Kernel/source|net/ipv6/xfrm6_state.c}} – IPv6 IPsec state management
:: {{The Linux Kernel/source|net/ipv6/xfrm6_input.c}} – IPv6 IPsec inbound processing
:: {{The Linux Kernel/source|net/ipv6/xfrm6_output.c}} – IPv6 IPsec outbound processing
:: {{The Linux Kernel/source|net/ipv6/ah6.c}} – Authentication Header (AH) transform for IPv6
:: {{The Linux Kernel/source|net/ipv6/esp6.c}} – Encapsulating Security Payload (ESP) transform for IPv6
:: {{The Linux Kernel/source|net/ipv6/ipcomp6.c}} – IP Payload Compression (IPComp) for IPv6 (RFC 3173)
:: {{The Linux Kernel/source|net/ipv6/mip6.c}} – Mobile IPv6 extension header handling
:: Segment Routing:
:: {{The Linux Kernel/source|net/ipv6/seg6.c}} – Segment Routing IPv6 (SRv6) core: genl API, encap helpers
:: {{The Linux Kernel/source|net/ipv6/seg6_local.c}} – SRv6 local endpoint behaviors (End, End.DX4, End.DT6, …)
:: {{The Linux Kernel/source|net/ipv6/seg6_iptunnel.c}} – SRv6 tunnel encapsulation via lwtunnel
:: {{The Linux Kernel/source|net/ipv6/seg6_hmac.c}} – SRv6 HMAC integrity verification (RFC 8754)
:: {{The Linux Kernel/source|net/ipv6/rpl.c}} – RPL source routing header
:: IOAM:
:: {{The Linux Kernel/source|net/ipv6/ioam6.c}} – In-situ OAM for IPv6 (RFC 9197): namespace and schema management
:: {{The Linux Kernel/source|net/ipv6/ioam6_iptunnel.c}} – IOAM insertion via lwtunnel encapsulation
:: Security:
:: {{The Linux Kernel/source|net/ipv6/calipso.c}} – CALIPSO Mandatory Access Control option (RFC 5570)
:: sysctl / proc:
:: {{The Linux Kernel/source|net/ipv6/sysctl_net_ipv6.c}} – /proc/sys/net/ipv6/ tunables
:: {{The Linux Kernel/source|net/ipv6/proc.c}} – /proc/net/snmp6 and /proc/net/dev_snmp6 statistics
: {{The Linux Kernel/source|net/tls}} – kernel TLS (since 4.13)
: {{The Linux Kernel/source|net/xdp}} – {{w|Express Data Path}} fast packet processing (since 4.8)
: {{The Linux Kernel/source|net/sched}} – traffic control and QoS
:: A {{The Linux Kernel/id|Qdisc}} (queuing discipline) sits on each {{The Linux Kernel/id|netdev_queue}} and controls packet scheduling on the TX path.
:: struct {{The Linux Kernel/id|Qdisc_ops}} – enqueue / dequeue / peek callbacks, registered via {{The Linux Kernel/id|register_qdisc}}
:: {{The Linux Kernel/source|net/sched/sch_generic.c}} – default pfifo_fast qdisc, {{The Linux Kernel/id|qdisc_run}}, {{The Linux Kernel/id|dev_watchdog}}
:: {{The Linux Kernel/source|net/sched/sch_api.c}} – tc netlink API: qdisc/class/filter CRUD
:: Common qdiscs:
:: {{The Linux Kernel/source|net/sched/sch_fifo.c}} – pfifo / bfifo - simple FIFO, default fallback
:: {{The Linux Kernel/source|net/sched/sch_fq.c}} – FQ - per-flow fair queue with pacing ({{The Linux Kernel/id|fq_sched_data}})
:: {{The Linux Kernel/source|net/sched/sch_fq_codel.c}} – FQ-CoDel - fair queue + CoDel AQM (default on many distros)
:: {{The Linux Kernel/source|net/sched/sch_htb.c}} – HTB - Hierarchical Token Bucket, bandwidth allocation
:: {{The Linux Kernel/source|net/sched/sch_cake.c}} – CAKE - combined AQM + shaper + flow isolation (since 4.19)
:: {{The Linux Kernel/source|net/sched/sch_codel.c}} – CoDel - Controlled Delay AQM
:: {{The Linux Kernel/source|net/sched/sch_tbf.c}} – TBF - Token Bucket Filter, rate limiter
:: {{The Linux Kernel/include|net/sch_generic.h}} – {{The Linux Kernel/id|Qdisc}}, {{The Linux Kernel/id|Qdisc_ops}}, {{The Linux Kernel/id|tcf_proto}} definitions
Socket performance options:
: {{The Linux Kernel/id|TCP_NODELAY}} – disable Nagle's algorithm for low-latency sends
: {{The Linux Kernel/id|TCP_CORK}} – accumulate small writes into full-size segments
: [https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/latest/html/optimizing_rhel_for_real_time_for_low_latency_operation/network-determinism-tips Network determinism tips, RHEL RT]
: [https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/latest/html/optimizing_rhel_for_real_time_for_low_latency_operation/reducing-tcp-performance-spikes Reducing TCP performance spikes] – TCP timestamp tuning
📚 References:
: {{The Linux Kernel/man|7|tcp}}
: {{The Linux Kernel/man|7|udp}}
: {{The Linux Kernel/man|7|raw}}
: {{The Linux Kernel/man|8|tc}} – traffic control
: {{w|Transport layer}} and {{w|Transmission_Control_Protocol|TCP}}
🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dudp stress-ng --udp],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dudp%2Dflood --udp-flood],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dsctp --sctp]
=== RDMA ===
🚀 advanced topic
🗝️ Acronyms:
: IB — {{w|InfiniBand}}, an interconnect standard, competes with {{w|Ethernet}}, {{w|Fibre Channel}}
: IPoIB — IP network emulation layer over InfiniBand networks
: SRP — {{w|SCSI RDMA Protocol}}
: ULP — Upper-layer protocols
: iSER — {{w|iSCSI Extensions for RDMA}}
⚲ Interfaces:
: https://github.com/linux-rdma/rdma-core
: {{The Linux Kernel/man|8|rdma}}
: {{The Linux Kernel/man|7|rdma_cm}} — RDMA communication manager
: {{The Linux Kernel/source|include/uapi/rdma}} – user-space RDMA API definitions
: {{The Linux Kernel/source|include/rdma}} – kernel RDMA API definitions
⚙️ Internals:
: {{The Linux Kernel/source|drivers/infiniband}} – InfiniBand core and drivers
:: {{The Linux Kernel/source|drivers/infiniband/ulp}} — Upper-layer protocols
:: {{The Linux Kernel/source|drivers/infiniband/sw}} — software drivers
:: {{The Linux Kernel/source|drivers/infiniband/hw}} — hardware device drivers
📚 References:
: {{The Linux Kernel/doc|InfiniBand|infiniband}}
: {{The Linux Kernel/doc|InfiniBand and RDMA Interfaces|driver-api/infiniband.html}}
== {{w|Netfilter}} ==
Netfilter is the kernel’s packet filtering and manipulation framework.
It provides hook points in the network stack where modules can inspect, modify, drop, or redirect packets.
{{w|nftables}} is the current user-facing interface, replacing the legacy {{w|iptables}}/ip6tables/ebtables/arptables tools.
{{w|Netfilter#Connection_tracking|connection tracking}} (conntrack) tracks network connections for stateful filtering and NAT.
⚲ API
: {{The Linux Kernel/man|8|nft}} – nftables rule management
: {{The Linux Kernel/man|8|iptables}}, {{The Linux Kernel/man|8|ip6tables}} – legacy packet filter
: {{The Linux Kernel/man|8|ebtables}}, {{The Linux Kernel/man|8|arptables}} – bridge and ARP filtering
: {{The Linux Kernel/man|8|ebtables-nft}}, {{The Linux Kernel/man|8|arptables-nft}}, {{The Linux Kernel/man|8|xtables-nft}} – nftables-backed compatibility
: [https://man.archlinux.org/man/ipset.8 ipset] – IP set management
: {{The Linux Kernel/man|8|conntrack}} – conntrack table management
: /proc/net/nf_conntrack – active connections
: /proc/sys/net/netfilter/ – conntrack tunables
: {{The Linux Kernel/include|linux/netfilter.h}} – hook API
:: {{The Linux Kernel/id|nf_hook_state}}, {{The Linux Kernel/id|nf_register_net_hook}}
: {{The Linux Kernel/include|uapi/linux/netfilter}}, {{The Linux Kernel/include|linux/netfilter}}
: {{The Linux Kernel/include|net/netfilter}}, {{The Linux Kernel/include|net/netns/netfilter.h}}
: {{The Linux Kernel/include|linux/netfilter/x_tables.h}} – xtables match/target registration
⚙️ Internals
: {{The Linux Kernel/source|net/netfilter}} – packet filtering framework
:: {{The Linux Kernel/source|net/netfilter/core.c}} – hook registration and dispatch
:: {{The Linux Kernel/source|net/netfilter/nf_tables_api.c}} – nftables kernel API
:: {{The Linux Kernel/source|net/netfilter/nf_tables_core.c}} – nftables rule evaluation
:: {{The Linux Kernel/source|net/netfilter/nf_conntrack_core.c}} – connection tracking core
:: {{The Linux Kernel/source|net/netfilter/nf_nat_core.c}} – {{w|Network address translation|NAT}} core
:: {{The Linux Kernel/source|net/netfilter/nf_flow_table_core.c}} – hardware offload flowtable
📖 References
: {{The Linux Kernel/doc|Netfilter Sysfs variables|networking/netfilter-sysctl.html}}
: {{The Linux Kernel/doc|Netfilter Conntrack Sysfs variables|networking/nf_conntrack-sysctl.html}}
: {{The Linux Kernel/doc|Netfilter’s flowtable infrastructure|networking/nf_flowtable.html}}
: {{w|nftables}}, https://wiki.nftables.org/
: https://lwn.net/Kernel/Index/#Networking-Packet_filtering
== Network device {{w|Network interface|interfaces}} ==
⚲ Interfaces
: <code>ip -brief link show</code>
: <code>ls -l /sys/class/net</code>
: {{The Linux Kernel/id|devm_register_netdev}} registers {{The Linux Kernel/id|net_device}}, net_device_ops
:: {{The Linux Kernel/id|dev_queue_xmit}} queues socket buffers into transmit queue
: {{The Linux Kernel/include|linux/netdevice.h}}
: {{The Linux Kernel/include|linux/skbuff.h}}
:: {{The Linux Kernel/id|sk_buff}} socket buffer (skb)
: /sys/class/net/*/statistics/ – per-interface packet and byte counters
: {{The Linux Kernel/man|8|devlink}} – manage switchdev, eswitch, shared buffers and firmware of network devices
: {{The Linux Kernel/man|8|bridge}} – show/manipulate bridge forwarding, MAC and VLAN tables
: [https://github.com/sosreport/sos/blob/main/sos/report/plugins/networking.py sos networking plugin] – diagnostics collection for network subsystem
👁 Example: {{The Linux Kernel/source|drivers/net/loopback.c}} - the most famous and simple interface '''lo'''
⚙️ Internals
: {{The Linux Kernel/source|net/core}} – core networking infrastructure
:: Device:
:: {{The Linux Kernel/source|net/core/dev.c}} – network device operations core: xmit, receive, register/unregister ({{The Linux Kernel/id|__dev_queue_xmit}}, {{The Linux Kernel/id|netif_receive_skb}})
:: {{The Linux Kernel/include|net/neighbour.h}}, {{The Linux Kernel/source|net/core/neighbour.c}} – generic neighbour (ARP/NDP) cache ({{The Linux Kernel/id|neigh_lookup}}, {{The Linux Kernel/id|neighbour}})
:: {{The Linux Kernel/source|net/core/rtnetlink.c}} – rtnetlink: netlink interface for routing and device config ({{The Linux Kernel/id|__rtnl_register_many}})
:: {{The Linux Kernel/source|net/core/net-sysfs.c}} – /sys/class/net/ device attributes
:: {{The Linux Kernel/source|net/core/sysctl_net_core.c}} – /proc/sys/net/core/ tunables
:: Sockets:
:: {{The Linux Kernel/include|net/sock.h}}, {{The Linux Kernel/source|net/core/sock.c}} – {{The Linux Kernel/id|sock}} core: allocation, options, buffer management
:: {{The Linux Kernel/include|linux/skbuff.h}}, {{The Linux Kernel/source|net/core/skbuff.c}} – {{The Linux Kernel/id|sk_buff}} allocation, cloning, manipulation ({{The Linux Kernel/id|alloc_skb}}, {{The Linux Kernel/id|skb_clone}})
:: {{The Linux Kernel/source|net/core/datagram.c}} – generic datagram recv helpers ({{The Linux Kernel/id|skb_recv_datagram}})
:: {{The Linux Kernel/source|net/core/stream.c}} – generic stream socket helpers ({{The Linux Kernel/id|sk_stream_wait_connect}})
:: {{The Linux Kernel/source|net/core/scm.c}} – socket control message (ancillary data) handling
:: {{The Linux Kernel/include|net/sock_reuseport.h}}, {{The Linux Kernel/source|net/core/sock_reuseport.c}} – SO_REUSEPORT socket selection ({{The Linux Kernel/id|reuseport_add_sock}})
:: {{The Linux Kernel/include|linux/filter.h}}, {{The Linux Kernel/source|net/core/filter.c}} – socket filtering: BPF/cBPF/eBPF attach to sockets ({{The Linux Kernel/id|sk_filter_trim_cap}})
:: Routing / forwarding:
:: {{The Linux Kernel/include|net/dst.h}}, {{The Linux Kernel/source|net/core/dst.c}} – destination cache ({{The Linux Kernel/id|dst_entry}}, {{The Linux Kernel/id|dst_alloc}})
:: {{The Linux Kernel/include|net/flow_dissector.h}}, {{The Linux Kernel/source|net/core/flow_dissector.c}} – packet field extraction for hashing and steering ({{The Linux Kernel/id|skb_flow_dissector_init}}, {{The Linux Kernel/id|skb_flow_get_ports}})
:: {{The Linux Kernel/include|net/lwtunnel.h}}, {{The Linux Kernel/source|net/core/lwtunnel.c}} – lightweight tunnel infrastructure ({{The Linux Kernel/id|lwtunnel_build_state}})
:: {{The Linux Kernel/include|net/net_namespace.h}}, {{The Linux Kernel/source|net/core/net_namespace.c}} – network namespace lifecycle ({{The Linux Kernel/id|copy_net_ns}}, {{The Linux Kernel/id|net_ns_ops}})
:: Offload:
:: {{The Linux Kernel/source|net/core/gro.c}} – Generic Receive Offload ({{The Linux Kernel/id|gro_receive_skb}}, {{The Linux Kernel/id|dev_gro_receive}})
:: {{The Linux Kernel/source|net/core/gso.c}} – Generic Segmentation Offload ({{The Linux Kernel/id|__skb_gso_segment}}, {{The Linux Kernel/id|skb_mac_gso_segment}})
:: {{The Linux Kernel/include|net/xdp.h}}, {{The Linux Kernel/source|net/core/xdp.c}} – XDP buffer and memory model ({{The Linux Kernel/id|xdp_rxq_info}}, {{The Linux Kernel/id|xdp_buff}})
:: {{The Linux Kernel/include|net/page_pool/types.h}}, {{The Linux Kernel/source|net/core/page_pool.c}} – page pool allocator for zero-copy RX ({{The Linux Kernel/id|page_pool_create}})
:: Diagnostics / tools:
:: {{The Linux Kernel/source|net/core/secure_seq.c}} – ISN and port randomization ({{The Linux Kernel/id|secure_tcp_seq_and_ts_off}}, {{The Linux Kernel/id|secure_ipv4_port_ephemeral}})
:: {{The Linux Kernel/source|net/core/netpoll.c}} – network console / crash dump transport ({{The Linux Kernel/id|netpoll_send_skb}})
:: {{The Linux Kernel/source|net/core/drop_monitor.c}} – kfree_skb drop event monitor ({{The Linux Kernel/id|send_dm_alert}}, {{The Linux Kernel/id|net_dm_alert_summary_ops}})
:: {{The Linux Kernel/source|net/core/pktgen.c}} – in-kernel packet generator ({{The Linux Kernel/man|8|pktgen}})
:: {{The Linux Kernel/source|net/core/timestamping.c}} – SO_TIMESTAMPING and PHY timestamping helpers
: function {{The Linux Kernel/id|loopback_xmit}} receives skb and passes it back with {{The Linux Kernel/id|netif_rx}}
🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Drawsock stress-ng --rawsock],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dicmp%2Dflood --icmp-flood]
📚 Further reading
: {{The Linux Kernel/man|8|ip-link}} – network device configuration
: {{The Linux Kernel/man|8|ip-stats}} – manage and show interface statistics
: {{The Linux Kernel/man|7|netdevice}} – low-level access to Linux network devices
: {{The Linux Kernel/man|7|packet}} – packet interface on device level
: [https://www.coverfire.com/articles/queueing-in-the-linux-network-stack/ Queueing in the Linux Network Stack]
💾 Historical
: [http://www.tldp.org/LDP/tlk/net/net.html LDP TLK Chapter 10 Networks]
== Network drivers==
: {{The Linux Kernel/include|linux/if_ether.h}} – IEEE 802.3 Ethernet constants and header
:{{The Linux Kernel/include|linux/etherdevice.h}}
: {{w|New_API|NAPI}}
: [https://wiki.linuxfoundation.org/networking/napi NAPI Driver design]
:: ⚲ API:
::: {{The Linux Kernel/id|netif_napi_add}} – registers {{The Linux Kernel/id|napi_struct}} for a device queue
::: {{The Linux Kernel/id|napi_schedule}} – raises {{The Linux Kernel/id|NET_RX_SOFTIRQ}} from IRQ handler
::: {{The Linux Kernel/id|netif_receive_skb}} – delivers skb to protocol handlers
::: {{The Linux Kernel/id|napi_complete_done}} – signals poll() exhausted its quota
:: ⚙️ Internals:
::: {{The Linux Kernel/id|softnet_data}} – per-CPU: poll_list, {{The Linux Kernel/id|input_pkt_queue}}, completion queue
::: {{The Linux Kernel/id|net_dev_init}} – registers {{The Linux Kernel/id|NET_RX_SOFTIRQ}} / {{The Linux Kernel/id|NET_TX_SOFTIRQ}} handlers
:::: {{The Linux Kernel/id|net_tx_action}} – TX softirq handler:
::::: frees completed skbs from {{The Linux Kernel/id|softnet_data}}→completion_queue
::::: drains {{The Linux Kernel/id|softnet_data}}→output_queue of pending qdiscs ({{The Linux Kernel/id|qdisc_run}} → driver ndo_start_xmit)
:::: {{The Linux Kernel/id|net_rx_action}} – RX softirq handler; drains up to {{The Linux Kernel/id|netdev_budget}} (300) packets
::::: {{The Linux Kernel/id|napi_poll}} → driver napi->poll()
:::::: {{The Linux Kernel/id|netif_receive_skb}} → {{The Linux Kernel/id|__netif_receive_skb_core}} → {{The Linux Kernel/id|ip_rcv}} / {{The Linux Kernel/id|ipv6_rcv}} …
::: Legacy (pre-NAPI): {{The Linux Kernel/id|netif_rx}} → {{The Linux Kernel/id|input_pkt_queue}} → backlog napi (same drain)
:: 👁 example
::: {{The Linux Kernel/id|e1000_intr}} → {{The Linux Kernel/id|__napi_schedule}}
::: {{The Linux Kernel/id|e1000e_poll}} (napi->poll()) → {{The Linux Kernel/id|napi_complete_done}}
: {{The Linux Kernel/id|ether_setup}} setups Ethernet network device
: 👁 An example of Ethernet driver: {{The Linux Kernel/id|e1000_probe}}
⚙️ Internals:
: {{The Linux Kernel/source|drivers/net}} – network device drivers
: {{The Linux Kernel/source|drivers/net/wireless}} – wireless drivers
: {{The Linux Kernel/source|drivers/net/ethernet}} – Ethernet drivers
: {{The Linux Kernel/source|net/wireless}} – cfg80211, wireless configuration API and userspace interface via {{The Linux Kernel/man|8|iw}}
: {{The Linux Kernel/source|net/mac80211}} – mac80211, software 802.11 MAC layer used by most WiFi drivers
: {{The Linux Kernel/source|net/bluetooth}} – {{w|Bluetooth}} protocol stack
: {{The Linux Kernel/source|net/bridge}} – {{The Linux Kernel/doc|Ethernet bridging|networking/bridge.html}}
📚 References:
: {{The Linux Kernel/man|8|ethtool}} – query or control network driver and hardware settings
: [[w:Data link layer|Data link layer]]: [[w:Ethernet|Ethernet]]
: [https://lwn.net/Articles/358910/ GRO - Generic Receive Offload]
: {{The Linux Kernel/doc|Segmentation Offloads|networking/segmentation-offloads.html}}
: https://wireless.wiki.kernel.org
<hr>
📚 Further reading
: [https://sysprog21.github.io/lkmpg/#network-drivers LKMPG: Network Drivers]
💾 ''Historical'':
: [http://www.xml.com/ldd/chapter/book/ch14.html LDD2:Network Drivers]
: [http://lwn.net/images/pdf/LDD3/ch17.pdf LDD3:Network Drivers]
: [http://www.tldp.org/HOWTO/KernelAnalysis-HOWTO-8.html Kernel Analysis: Networking, 2003]
: [https://web.archive.org/web/20111030030517/http://www.linuxfoundation.org/collaborate/workgroups/networking/networkoverview network_overview]
📖 Further reading about networking
: {{The Linux Kernel/doc|Networking interfaces|subsystem-apis.html#networking-interfaces}}
:: {{The Linux Kernel/doc|Networking|networking}}
: https://lwn.net/Kernel/Index/#Networking
: https://lartc.org/ – Linux Advanced Routing & Traffic Control
: {{The Linux Kernel/man|8|ip}} – show / manipulate routing, network devices, interfaces and tunnels
: {{The Linux Kernel/man|8|tc}} – show / manipulate traffic control settings
: [https://github.com/iovisor/bcc/blob/master/README.md#network-and-sockets-tools bcc/ebpf networking tools]
: [https://github.com/cilium/cilium eBPF-based Networking, Security, and Observability]
: [https://retis.readthedocs.io/ Retis – tracing packets in the Linux networking stack & friends]
{{BookCat}}
c0w3dcbxapgnckn8p83rx8lz6zryg1v
4669563
4669561
2026-09-10T12:36:40Z
Conan
3188
NAPI internals under net/core/dev.c, driver interaction under Network drivers
4669563
wikitext
text/x-wiki
<noinclude>{{DISPLAYTITLE:Network functionality}}</noinclude>
{|style="width: 25%; float: right; text-align:center;border-spacing: 0; color:black; margin:auto;" cellpadding=5pc
! bgcolor="#dff" |networking
|-
| bgcolor="#bff" |[[#Sockets|sockets access]]
|-
| bgcolor="#adf" |[[#Address_families|address families: inet, unix, ...]]
|-
| bgcolor="#9cd" |[[#Network_storage|network storage]]
|-
| bgcolor="#8bb" |[[#Protocols|protocols]]
|-
| bgcolor="#7a9" |[[#Network_device_interfaces|network interfaces]]
|-
| bgcolor="#798" |[[#Network_drivers|network drivers]]
|}
Linux kernel network functionality spans from sockets interface through protocols to network cards.
⚲ Shell interfaces:
: {{The Linux Kernel/man|8|netstat}} prints network connections, routing tables, interface statistics and other details
: {{The Linux Kernel/man|8|ip}} shows and configures routing, network devices, interfaces and tunnels
: {{The Linux Kernel/man|8|ss}} - socket statistics utility
== Sockets ==
⚲ API:
[https://man7.org/linux/man-pages/man0/sys_socket.h.0p.html sys/socket.h – main user mode sockets header]
Basic common and client side interface:
: {{The Linux Kernel/man|2|socket}} ↪ {{The Linux Kernel/id|__sys_socket}} creates an endpoint for communication
: struct {{The Linux Kernel/id|sockaddr}} - abstract socket address
: {{The Linux Kernel/man|2|connect}} ↪ {{The Linux Kernel/id|__sys_connect}};
: {{The Linux Kernel/man|2|shutdown}} shuts down part of a full-duplex connection
: {{The Linux Kernel/man|2|send}} ↪ {{The Linux Kernel/id|__sys_sendto}} sends a message on a socket
: {{The Linux Kernel/man|2|recv}} ↪ {{The Linux Kernel/id|__sys_recvfrom}}, {{The Linux Kernel/id|__sys_recvmsg}} receives a message from a socket
: {{The Linux Kernel/man|2|setsockopt}}, {{The Linux Kernel/man|2|getsockopt}} ↪ {{The Linux Kernel/id|__sys_setsockopt}} – set/get socket options
: {{The Linux Kernel/man|2|socketpair}} ↪ {{The Linux Kernel/id|__sys_socketpair}} – create a pair of connected sockets
Additional server side interface:
: {{The Linux Kernel/man|2|bind}} ↪ {{The Linux Kernel/id|__sys_bind}} - binds a sockaddr to a socket
: {{The Linux Kernel/man|2|listen}} ↪ {{The Linux Kernel/id|__sys_listen}} - listens for connections on a socket
: {{The Linux Kernel/man|2|accept}} ↪ {{The Linux Kernel/id|__sys_accept4}} - accepts a connection on a socket
⚙️ Internals
: struct '''{{The Linux Kernel/id|socket}}''' @ {{The Linux Kernel/include|linux/net.h}} contains
:: struct {{The Linux Kernel/id|proto_ops}} - abstract protocols interface
:: struct {{The Linux Kernel/id|sock}} - network layer representation of sockets {{The Linux Kernel/include|net/sock.h}}
: '''{{The Linux Kernel/id|__sys_socket}}''' ↯ call hierarchy:
:: {{The Linux Kernel/id|sock_create}}
::: {{The Linux Kernel/id|__sock_create}}
:::: {{The Linux Kernel/id|security_socket_create}}
:::: {{The Linux Kernel/id|sock_alloc}}
::::: {{The Linux Kernel/id|net_proto_family}}->create.
:::::: for example {{The Linux Kernel/id|inet_create}}. See [[#Address_families|Address families]] for other options.
: '''{{The Linux Kernel/id|__sys_connect}}''' ↯ call hierarchy:
:: {{The Linux Kernel/id|move_addr_to_kernel}}
::: {{The Linux Kernel/id|audit_sockaddr}}
::: {{The Linux Kernel/id|__sys_connect_file}}
:::: {{The Linux Kernel/id|sock_from_file}}
:::: {{The Linux Kernel/id|security_socket_connect}}
:::: {{The Linux Kernel/id|proto_ops}}->connect.
::::: for example {{The Linux Kernel/id|inet_stream_connect}}. See [[#Protocols|Protocols]] for other options.
: {{The Linux Kernel/source|net/socket.c}} – socket system calls implementation
: {{The Linux Kernel/source|net/core/sock.c}} – {{The Linux Kernel/id|sock}} core: allocation, options, buffer management
📚 References
: {{The Linux Kernel/man|7|socket}}
: {{The Linux Kernel/include|linux/socket.h}}
: {{w|Berkeley sockets}}
🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dsock stress-ng --sock],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dsockpair --sockpair]
== Network storage ==
🚀 advanced topic
🔧 TODO
⚲ API:
: {{The Linux Kernel/man|2|sendfile}} ↪ {{The Linux Kernel/id|do_sendfile}}.
See also [[../Storage#Zero-copy|Zero-copy between file descriptors]]
:{{w|Application layer|Application layer}}: {{w|Network File System}}
: {{The Linux Kernel/doc|NFS|filesystems/nfs}}, {{The Linux Kernel/include|linux/nfs_fs.h}}, {{The Linux Kernel/source|fs/nfs}}
:: {{The Linux Kernel/id|init_nfs_fs}}, {{The Linux Kernel/id|nfs4_fs_type}}, {{The Linux Kernel/id|nfs_fs_type}},
:: {{The Linux Kernel/id|init_nfsd}}, {{The Linux Kernel/id|nfsd_fs_type}}
: {{The Linux Kernel/doc|CIFS|admin-guide/cifs}}
:: {{The Linux Kernel/id|init_cifs}}
:: {{The Linux Kernel/id|cifs_fs_type}}, {{The Linux Kernel/id|smb3_fs_type}} {{The Linux Kernel/id|cifs_smb3_do_mount}}
: {{The Linux Kernel/doc|target and iSCSI Interfaces Guide|driver-api/target.html}}
📚 Further reading
: https://deepwiki.com/torvalds/linux/4.3-network-filesystems-(cifssmb)
== Transport and Network ==
=== Names ===
⚲ API: {{The Linux Kernel/man|2|uname}}, {{The Linux Kernel/man|2|sethostname}}, {{The Linux Kernel/man|2|gethostname}}, {{The Linux Kernel/man|2|setdomainname}} {{The Linux Kernel/man|2|getdomainname}}
: ↪ {{The Linux Kernel/id|utsname}}
⚙️ Details
: {{The Linux Kernel/id|utsname}} returns writable pointer to {{The Linux Kernel/id|new_utsname}} from {{The Linux Kernel/id|uts_namespace}} from {{The Linux Kernel/id|nsproxy}} from {{The Linux Kernel/id|current}} {{The Linux Kernel/id|task_struct}}.
: {{The Linux Kernel/id|CLONE_NEWUTS}}, {{The Linux Kernel/id|setns}}
: {{The Linux Kernel/source|kernel/utsname.c}} – UTS namespace management
📚 References:
: {{The Linux Kernel/man|7|namespaces}}
: {{The Linux Kernel/man|7|network_namespaces}}
: {{The Linux Kernel/man|7|uts_namespaces}}
=== Address families ===
⚲ API
: {{The Linux Kernel/man|2|getsockname}}
: {{The Linux Kernel/man|2|getpeername}}
: Address Family (AF) <big>domain</big> defines address format and address length <big>socklen_t</big>.
: {{The Linux Kernel/man|3|inet_ntop}}, {{The Linux Kernel/man|3|inet_pton}} (derive socklen_t from AF)
Common AF: {{The Linux Kernel/id|AF_UNIX}}, {{The Linux Kernel/id|AF_INET}}, {{The Linux Kernel/id|AF_NETLINK}}.
''PF - Protocol Family index ({{The Linux Kernel/id|PF_MAX}}) actually is the same as Address Family index (AF).''
⚙️ Internals of some AF
: {{The Linux Kernel/man|7|unix}} ↪ {{The Linux Kernel/id|unix_family_ops}} - sockets for local IPC, {{The Linux Kernel/source|net/unix}}
:: {{The Linux Kernel/id|unix_create}}
: {{The Linux Kernel/man|7|ip}} ↪ {{The Linux Kernel/id|inet_family_ops}} - IPv4
:: {{The Linux Kernel/id|inet_create}}
: {{The Linux Kernel/man|7|netlink}} ↪ {{The Linux Kernel/id|netlink_family_ops}} - communication between kernel and user space, {{The Linux Kernel/source|net/netlink}}
:: {{The Linux Kernel/include|linux/netlink.h}}, {{The Linux Kernel/include|linux/rtnetlink.h}} – netlink and routing netlink messages
:: {{The Linux Kernel/id|netlink_create}}
:: 🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dnetlink%2Dproc stress-ng --netlink-proc]
: {{The Linux Kernel/man|7|vsock}} ↪ {{The Linux Kernel/id|vsock_family_ops}} - communication between VM and hypervisor
:: {{The Linux Kernel/id|vsock_create}}
: {{The Linux Kernel/man|7|packet}} ↪ {{The Linux Kernel/id|packet_family_ops}} - device level interface
:: {{The Linux Kernel/id|packet_create}}
: {{The Linux Kernel/id|bt_sock_family_ops}} - Bluetooth
:: {{The Linux Kernel/id|bt_sock_create}}
There are more than 40 AFs in total (see {{The Linux Kernel/id|AF_MAX}})
⚙️ Internals
: {{The Linux Kernel/id|sock_register}} - registers {{The Linux Kernel/id|net_proto_family}}. See references to this identifiers to find more than 30 protocol families.
: {{The Linux Kernel/id|__sock_create}}
📚 Further reading
: {{The Linux Kernel/man|8|ip-address}} – protocol address management
: {{w|Internet layer}}
: {{The Linux Kernel/man|7|address_families}}
=== Protocols ===
Each Protocol Family (PF, ''same index as Address Family AF'') consists of several protocol implementations.
Directory /proc/net contains various files and subdirectories containing information about the networking layer.
File /proc/net/protocols lists available and used protocols.
In each PF protocols are classified to different types {{The Linux Kernel/id|sock_type}}, for example stream, datagram and raw socket.
TCP is type of stream, UDP is type of datagram, raw and ping are type of raw.
: {{The Linux Kernel/id|proto_register}} - registers struct {{The Linux Kernel/id|proto}} - protocol implementations:
: In {{The Linux Kernel/id|inet_init}} initcall, {{The Linux Kernel/id|inetsw_array}}, {{The Linux Kernel/id|proto_ops}} and {{The Linux Kernel/id|proto}} :
:: {{The Linux Kernel/id|inet_stream_ops}} & {{The Linux Kernel/id|tcp_prot}} {{The Linux Kernel/id|tcp_sendmsg}} ...
:: {{The Linux Kernel/id|inet_dgram_ops}} & {{The Linux Kernel/id|udp_prot}} {{The Linux Kernel/id|udp_sendmsg}} ...
:: {{The Linux Kernel/id|inet_sockraw_ops}}
::: {{The Linux Kernel/id|raw_prot}} {{The Linux Kernel/id|raw_sendmsg}} ...
::: {{The Linux Kernel/id|ping_prot}} {{The Linux Kernel/id|ping_v4_sendmsg}} ...
: In {{The Linux Kernel/id|af_unix_init}} initcall:
:: {{The Linux Kernel/id|unix_family_ops}}
::: {{The Linux Kernel/id|unix_create}}
:::: {{The Linux Kernel/id|unix_stream_ops}} {{The Linux Kernel/id|unix_stream_sendmsg}} ...
:::: {{The Linux Kernel/id|unix_dgram_ops}} {{The Linux Kernel/id|unix_dgram_sendmsg}} ...
:::: {{The Linux Kernel/id|unix_seqpacket_ops}} {{The Linux Kernel/id|unix_seqpacket_sendmsg}} ...
⚙️ Internals:
: {{The Linux Kernel/include|linux/in.h}}, {{The Linux Kernel/include|linux/ip.h}} – IPv4 address, protocol and header definitions
: {{The Linux Kernel/source|net/ipv4}} – IPv4 protocol stack
:: {{The Linux Kernel/source|net/ipv4/af_inet.c}} – PF_INET socket family ({{The Linux Kernel/id|inet_family_ops}}, {{The Linux Kernel/id|inet_init}})
:: {{The Linux Kernel/source|net/ipv4/protocol.c}} – IPv4 protocol handler registration ({{The Linux Kernel/id|inet_add_protocol}})
:: {{The Linux Kernel/source|net/ipv4/ip_input.c}} – IPv4 receive path ({{The Linux Kernel/id|ip_rcv}}, {{The Linux Kernel/id|ip_local_deliver}})
:: {{The Linux Kernel/source|net/ipv4/ip_output.c}} – IPv4 transmit path ({{The Linux Kernel/id|ip_output}}, {{The Linux Kernel/id|ip_queue_xmit}})
:: {{The Linux Kernel/source|net/ipv4/ip_forward.c}} – IPv4 packet forwarding ({{The Linux Kernel/id|ip_forward}})
:: {{The Linux Kernel/source|net/ipv4/ip_fragment.c}} – fragmentation and reassembly ({{The Linux Kernel/id|ip_do_fragment}})
:: {{The Linux Kernel/source|net/ipv4/ip_options.c}} – IP options parsing and building
:: {{The Linux Kernel/source|net/ipv4/ip_sockglue.c}} – IP socket options ({{The Linux Kernel/id|ip_setsockopt}})
:: Addressing:
:: {{The Linux Kernel/source|net/ipv4/devinet.c}} – per-device IPv4 address management ({{The Linux Kernel/id|inetdev_init}})
:: {{The Linux Kernel/source|net/ipv4/arp.c}} – Address Resolution Protocol ({{The Linux Kernel/id|arp_rcv}}, {{The Linux Kernel/id|arp_send}})
:: Routing:
:: {{The Linux Kernel/source|net/ipv4/route.c}} – IPv4 route lookup and cache ({{The Linux Kernel/id|ip_route_output_key}}, {{The Linux Kernel/id|rtable}})
:: {{The Linux Kernel/source|net/ipv4/fib_frontend.c}} – FIB user interface: netlink and ioctl ({{The Linux Kernel/id|fib_table_lookup}})
:: {{The Linux Kernel/source|net/ipv4/fib_trie.c}} – LC-trie FIB implementation ({{The Linux Kernel/id|fib_trie_table}})
:: {{The Linux Kernel/source|net/ipv4/fib_semantics.c}} – FIB entry semantics: nexthop, scope, metrics
:: {{The Linux Kernel/source|net/ipv4/fib_rules.c}} – IPv4 routing policy rules (ip rule)
:: {{The Linux Kernel/source|net/ipv4/nexthop.c}} – generic nexthop objects (since 5.3, {{The Linux Kernel/id|nexthop_find_by_id}})
:: {{The Linux Kernel/source|net/ipv4/inetpeer.c}} – peer storage for per-destination state ({{The Linux Kernel/id|inet_getpeer}})
:: ICMP / IGMP:
:: {{The Linux Kernel/source|net/ipv4/icmp.c}} – ICMPv4 ({{The Linux Kernel/id|icmp_rcv}}, {{The Linux Kernel/id|icmp_send}})
:: {{The Linux Kernel/source|net/ipv4/igmp.c}} – Internet Group Management Protocol, MLDv1 ({{The Linux Kernel/id|ip_mc_join_group}})
:: {{The Linux Kernel/source|net/ipv4/ipmr.c}} – IPv4 multicast routing ({{The Linux Kernel/id|ipmr_mfc_add}})
:: Transport protocols:
:: {{The Linux Kernel/include|net/tcp.h}}, {{The Linux Kernel/source|net/ipv4/tcp.c}} – TCP core (connect, send, recv, close)
::: {{The Linux Kernel/id|tcp_sock}} – per-connection TCP state, {{The Linux Kernel/id|tcp_sk}} – cast from sock
::: {{The Linux Kernel/id|tcphdr}} – TCP header struct
::: {{The Linux Kernel/id|tcp_congestion_ops}} – pluggable congestion control ({{w|TCP congestion control|cubic, bbr, reno}})
:: {{The Linux Kernel/source|net/ipv4/tcp_ipv4.c}} – TCP over IPv4 ({{The Linux Kernel/id|tcp_v4_rcv}}, {{The Linux Kernel/id|tcp_prot}})
:: {{The Linux Kernel/source|net/ipv4/tcp_input.c}} – TCP receive processing ({{The Linux Kernel/id|tcp_rcv_established}}, ACK, SACK)
:: {{The Linux Kernel/source|net/ipv4/tcp_output.c}} – TCP transmit: segment building, retransmit ({{The Linux Kernel/id|tcp_write_xmit}})
:: {{The Linux Kernel/source|net/ipv4/tcp_timer.c}} – TCP timers: retransmit, keepalive, TIME_WAIT ({{The Linux Kernel/id|tcp_retransmit_timer}})
:: {{The Linux Kernel/source|net/ipv4/tcp_minisocks.c}} – TIME_WAIT and SYN_RECV mini sockets ({{The Linux Kernel/id|tcp_time_wait}})
:: {{The Linux Kernel/source|net/ipv4/tcp_fastopen.c}} – TCP Fast Open ({{The Linux Kernel/id|tcp_fastopen_cookie}}, since 3.6)
:: {{The Linux Kernel/source|net/ipv4/tcp_ao.c}} – TCP Authentication Option (RFC 5925, since 6.7)
:: {{The Linux Kernel/source|net/ipv4/tcp_metrics.c}} – per-destination TCP metrics cache
:: {{The Linux Kernel/source|net/ipv4/tcp_cong.c}} – congestion control framework ({{The Linux Kernel/id|tcp_register_congestion_control}})
:: {{The Linux Kernel/source|net/ipv4/tcp_cubic.c}} – CUBIC congestion control (default)
:: {{The Linux Kernel/source|net/ipv4/tcp_bbr.c}} – BBR congestion control (since 4.9)
:: {{The Linux Kernel/source|net/ipv4/syncookies.c}} – TCP SYN cookies ({{The Linux Kernel/id|cookie_v4_check}})
:: {{The Linux Kernel/source|net/ipv4/udp.c}} – UDP ({{The Linux Kernel/id|udp_rcv}}, {{The Linux Kernel/id|udp_prot}})
:: {{The Linux Kernel/source|net/ipv4/raw.c}} – raw IP sockets ({{The Linux Kernel/id|raw_prot}})
:: {{The Linux Kernel/source|net/ipv4/ping.c}} – ping socket / ICMP echo ({{The Linux Kernel/id|ping_prot}})
:: {{The Linux Kernel/source|net/ipv4/datagram.c}} – common UDP/RAW datagram helpers ({{The Linux Kernel/id|ip4_datagram_connect}})
:: Socket infrastructure:
:: {{The Linux Kernel/source|net/ipv4/inet_connection_sock.c}} – connection-oriented socket base ({{The Linux Kernel/id|inet_csk_accept}})
:: {{The Linux Kernel/source|net/ipv4/inet_hashtables.c}} – TCP/UDP socket hash table lookup ({{The Linux Kernel/id|inet_lookup_established}})
:: {{The Linux Kernel/source|net/ipv4/inet_timewait_sock.c}} – TIME_WAIT socket recycling
:: {{The Linux Kernel/source|net/ipv4/inet_fragment.c}} – generic IP fragment queue management
:: {{The Linux Kernel/source|net/ipv4/inet_diag.c}} – socket diagnostics via netlink (ss, {{The Linux Kernel/id|inet_diag_handler}})
:: Tunnels:
:: {{The Linux Kernel/source|net/ipv4/ip_tunnel.c}} – generic IP tunnel framework ({{The Linux Kernel/id|ip_tunnel_xmit}})
:: {{The Linux Kernel/source|net/ipv4/ip_gre.c}} – GRE over IPv4 (gre, gretap)
:: {{The Linux Kernel/source|net/ipv4/ipip.c}} – IP-in-IP tunnel (ipip)
:: {{The Linux Kernel/source|net/ipv4/ip_vti.c}} – virtual tunnel interface (vti, IPsec-aware)
:: {{The Linux Kernel/source|net/ipv4/fou_core.c}} – Foo-over-UDP encapsulation (since 3.18)
:: {{The Linux Kernel/source|net/ipv4/gre_demux.c}} – GRE protocol demultiplexer
:: {{The Linux Kernel/source|net/ipv4/tunnel4.c}} – IPv4 tunnel protocol registration
:: IPsec / XFRM:
:: {{The Linux Kernel/source|net/ipv4/xfrm4_policy.c}} – IPv4 IPsec policy ({{The Linux Kernel/id|xfrm4_dst_ops}})
:: {{The Linux Kernel/source|net/ipv4/xfrm4_state.c}} – IPv4 IPsec state management
:: {{The Linux Kernel/source|net/ipv4/xfrm4_input.c}} – IPv4 IPsec inbound processing
:: {{The Linux Kernel/source|net/ipv4/xfrm4_output.c}} – IPv4 IPsec outbound processing
:: {{The Linux Kernel/source|net/ipv4/ah4.c}} – Authentication Header (AH) for IPv4
:: {{The Linux Kernel/source|net/ipv4/esp4.c}} – Encapsulating Security Payload (ESP) for IPv4
:: {{The Linux Kernel/source|net/ipv4/ipcomp.c}} – IP Payload Compression (IPComp, RFC 3173)
:: Security:
:: {{The Linux Kernel/source|net/ipv4/cipso_ipv4.c}} – CIPSO Commercial IP Security Option ({{The Linux Kernel/id|cipso_v4_validate}})
:: sysctl / proc:
:: {{The Linux Kernel/source|net/ipv4/sysctl_net_ipv4.c}} – /proc/sys/net/ipv4/ tunables
:: {{The Linux Kernel/source|net/ipv4/proc.c}} – /proc/net/snmp and /proc/net/netstat statistics
:: {{The Linux Kernel/source|net/ipv4/netfilter}} – IPv4 netfilter hooks (see [[#Netfilter|Netfilter]])
: {{The Linux Kernel/include|linux/ipv6.h}} – IPv6 definitions
: {{The Linux Kernel/source|net/ipv6}} – IPv6 protocol stack
:: {{The Linux Kernel/source|net/ipv6/af_inet6.c}} – PF_INET6 socket family ({{The Linux Kernel/id|inet6_family_ops}}, {{The Linux Kernel/id|inet6_init}})
:: {{The Linux Kernel/source|net/ipv6/protocol.c}} – IPv6 protocol handler registration ({{The Linux Kernel/id|inet6_add_protocol}})
:: {{The Linux Kernel/source|net/ipv6/ip6_input.c}} – IPv6 receive path ({{The Linux Kernel/id|ipv6_rcv}}, {{The Linux Kernel/id|ip6_forward}})
:: {{The Linux Kernel/source|net/ipv6/ip6_output.c}} – IPv6 transmit path ({{The Linux Kernel/id|ip6_output}}, {{The Linux Kernel/id|ip6_xmit}})
:: {{The Linux Kernel/source|net/ipv6/ip6_checksum.c}} – UDP/TCP checksum over IPv6
:: {{The Linux Kernel/source|net/ipv6/ila}} – {{w|IPv6 address|Identifier Locator Addressing}} (ILA): address translation for scalable IPv6 overlays
:: {{The Linux Kernel/source|net/ipv6/netfilter}} – IPv6 netfilter hooks (see [[#Netfilter|Netfilter]])
:: Addressing:
:: {{The Linux Kernel/source|net/ipv6/addrconf.c}} – address autoconfiguration: SLAAC, DAD, RA handling ({{The Linux Kernel/id|addrconf_notify}})
:: {{The Linux Kernel/source|net/ipv6/addrconf_core.c}} – address scope helpers for static builds (no full IPv6 module)
:: {{The Linux Kernel/source|net/ipv6/ndisc.c}} – Neighbor Discovery Protocol ({{w|Neighbor Discovery Protocol|NDP}}, RFC 4861)
:: {{The Linux Kernel/source|net/ipv6/anycast.c}} – anycast address support
:: {{The Linux Kernel/source|net/ipv6/addrlabel.c}} – address label subsystem for source address selection (RFC 6724)
:: Routing:
:: {{The Linux Kernel/source|net/ipv6/route.c}} – IPv6 routing table lookup and route management ({{The Linux Kernel/id|ip6_route_output}}, {{The Linux Kernel/id|rt6_info}})
:: {{The Linux Kernel/source|net/ipv6/ip6_fib.c}} – IPv6 FIB trie ({{The Linux Kernel/id|fib6_table}}, {{The Linux Kernel/id|fib6_info}})
:: {{The Linux Kernel/source|net/ipv6/fib6_rules.c}} – IPv6 routing policy rules (ip rule)
:: {{The Linux Kernel/source|net/ipv6/ip6_flowlabel.c}} – flow label manager ({{The Linux Kernel/id|ip6_flowlabel}})
:: Extension headers:
:: {{The Linux Kernel/source|net/ipv6/exthdrs.c}} – extension header processing (hop-by-hop, routing, destination)
:: Transport protocols:
:: {{The Linux Kernel/source|net/ipv6/tcp_ipv6.c}} – TCP over IPv6 ({{The Linux Kernel/id|tcp_v6_rcv}}, {{The Linux Kernel/id|tcpv6_prot}}, {{The Linux Kernel/id|tcp_v6_syn_recv_sock}})
:: {{The Linux Kernel/source|net/ipv6/udp.c}} – UDP over IPv6 ({{The Linux Kernel/id|udpv6_prot}}, {{The Linux Kernel/id|udpv6_rcv}})
:: {{The Linux Kernel/source|net/ipv6/raw.c}} – raw sockets over IPv6
:: {{The Linux Kernel/source|net/ipv6/ping.c}} – ping socket ({{w|ICMPv6}} echo) over IPv6
:: {{The Linux Kernel/source|net/ipv6/datagram.c}} – common UDP/RAW datagram helpers ({{The Linux Kernel/id|ip6_datagram_connect}})
:: {{The Linux Kernel/source|net/ipv6/syncookies.c}} – TCP SYN cookie support for IPv6
:: {{The Linux Kernel/source|net/ipv6/reassembly.c}} – fragment reassembly ({{The Linux Kernel/id|ipv6_frag_rcv}})
:: ICMPv6:
:: {{The Linux Kernel/source|net/ipv6/icmp.c}} – ICMPv6 (RFC 4443): error messages, echo, {{The Linux Kernel/id|icmpv6_send}}
:: Multicast:
:: {{The Linux Kernel/source|net/ipv6/mcast.c}} – multicast group management, MLDv1/v2 ({{The Linux Kernel/id|ipv6_dev_mc_inc}})
:: {{The Linux Kernel/source|net/ipv6/ip6mr.c}} – IPv6 multicast routing ({{The Linux Kernel/id|ip6mr_table}})
:: {{The Linux Kernel/source|net/ipv6/mcast_snoop.c}} – MLD snooping for bridge integration
:: Tunnels:
:: {{The Linux Kernel/source|net/ipv6/ip6_tunnel.c}} – IPv6-in-IPv6 tunnel (ip6tnl)
:: {{The Linux Kernel/source|net/ipv6/ip6_gre.c}} – GRE over IPv6 (ip6gre, ip6gretap)
:: {{The Linux Kernel/source|net/ipv6/sit.c}} – IPv4-in-IPv6 Simple Internet Transition tunnel (sit)
:: {{The Linux Kernel/source|net/ipv6/ip6_vti.c}} – virtual tunnel interface over IPv6 (vti6, IPsec-aware)
:: {{The Linux Kernel/source|net/ipv6/ip6_udp_tunnel.c}} – UDP encapsulation helpers for IPv6 tunnels
:: {{The Linux Kernel/source|net/ipv6/fou6.c}} – Foo-over-UDP encapsulation for IPv6
:: IPsec / XFRM:
:: {{The Linux Kernel/source|net/ipv6/xfrm6_policy.c}} – IPv6 IPsec policy lookup ({{The Linux Kernel/id|xfrm6_dst_ops}})
:: {{The Linux Kernel/source|net/ipv6/xfrm6_state.c}} – IPv6 IPsec state management
:: {{The Linux Kernel/source|net/ipv6/xfrm6_input.c}} – IPv6 IPsec inbound processing
:: {{The Linux Kernel/source|net/ipv6/xfrm6_output.c}} – IPv6 IPsec outbound processing
:: {{The Linux Kernel/source|net/ipv6/ah6.c}} – Authentication Header (AH) transform for IPv6
:: {{The Linux Kernel/source|net/ipv6/esp6.c}} – Encapsulating Security Payload (ESP) transform for IPv6
:: {{The Linux Kernel/source|net/ipv6/ipcomp6.c}} – IP Payload Compression (IPComp) for IPv6 (RFC 3173)
:: {{The Linux Kernel/source|net/ipv6/mip6.c}} – Mobile IPv6 extension header handling
:: Segment Routing:
:: {{The Linux Kernel/source|net/ipv6/seg6.c}} – Segment Routing IPv6 (SRv6) core: genl API, encap helpers
:: {{The Linux Kernel/source|net/ipv6/seg6_local.c}} – SRv6 local endpoint behaviors (End, End.DX4, End.DT6, …)
:: {{The Linux Kernel/source|net/ipv6/seg6_iptunnel.c}} – SRv6 tunnel encapsulation via lwtunnel
:: {{The Linux Kernel/source|net/ipv6/seg6_hmac.c}} – SRv6 HMAC integrity verification (RFC 8754)
:: {{The Linux Kernel/source|net/ipv6/rpl.c}} – RPL source routing header
:: IOAM:
:: {{The Linux Kernel/source|net/ipv6/ioam6.c}} – In-situ OAM for IPv6 (RFC 9197): namespace and schema management
:: {{The Linux Kernel/source|net/ipv6/ioam6_iptunnel.c}} – IOAM insertion via lwtunnel encapsulation
:: Security:
:: {{The Linux Kernel/source|net/ipv6/calipso.c}} – CALIPSO Mandatory Access Control option (RFC 5570)
:: sysctl / proc:
:: {{The Linux Kernel/source|net/ipv6/sysctl_net_ipv6.c}} – /proc/sys/net/ipv6/ tunables
:: {{The Linux Kernel/source|net/ipv6/proc.c}} – /proc/net/snmp6 and /proc/net/dev_snmp6 statistics
: {{The Linux Kernel/source|net/tls}} – kernel TLS (since 4.13)
: {{The Linux Kernel/source|net/xdp}} – {{w|Express Data Path}} fast packet processing (since 4.8)
: {{The Linux Kernel/source|net/sched}} – traffic control and QoS
:: A {{The Linux Kernel/id|Qdisc}} (queuing discipline) sits on each {{The Linux Kernel/id|netdev_queue}} and controls packet scheduling on the TX path.
:: struct {{The Linux Kernel/id|Qdisc_ops}} – enqueue / dequeue / peek callbacks, registered via {{The Linux Kernel/id|register_qdisc}}
:: {{The Linux Kernel/source|net/sched/sch_generic.c}} – default pfifo_fast qdisc, {{The Linux Kernel/id|qdisc_run}}, {{The Linux Kernel/id|dev_watchdog}}
:: {{The Linux Kernel/source|net/sched/sch_api.c}} – tc netlink API: qdisc/class/filter CRUD
:: Common qdiscs:
:: {{The Linux Kernel/source|net/sched/sch_fifo.c}} – pfifo / bfifo - simple FIFO, default fallback
:: {{The Linux Kernel/source|net/sched/sch_fq.c}} – FQ - per-flow fair queue with pacing ({{The Linux Kernel/id|fq_sched_data}})
:: {{The Linux Kernel/source|net/sched/sch_fq_codel.c}} – FQ-CoDel - fair queue + CoDel AQM (default on many distros)
:: {{The Linux Kernel/source|net/sched/sch_htb.c}} – HTB - Hierarchical Token Bucket, bandwidth allocation
:: {{The Linux Kernel/source|net/sched/sch_cake.c}} – CAKE - combined AQM + shaper + flow isolation (since 4.19)
:: {{The Linux Kernel/source|net/sched/sch_codel.c}} – CoDel - Controlled Delay AQM
:: {{The Linux Kernel/source|net/sched/sch_tbf.c}} – TBF - Token Bucket Filter, rate limiter
:: {{The Linux Kernel/include|net/sch_generic.h}} – {{The Linux Kernel/id|Qdisc}}, {{The Linux Kernel/id|Qdisc_ops}}, {{The Linux Kernel/id|tcf_proto}} definitions
Socket performance options:
: {{The Linux Kernel/id|TCP_NODELAY}} – disable Nagle's algorithm for low-latency sends
: {{The Linux Kernel/id|TCP_CORK}} – accumulate small writes into full-size segments
: [https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/latest/html/optimizing_rhel_for_real_time_for_low_latency_operation/network-determinism-tips Network determinism tips, RHEL RT]
: [https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/latest/html/optimizing_rhel_for_real_time_for_low_latency_operation/reducing-tcp-performance-spikes Reducing TCP performance spikes] – TCP timestamp tuning
📚 References:
: {{The Linux Kernel/man|7|tcp}}
: {{The Linux Kernel/man|7|udp}}
: {{The Linux Kernel/man|7|raw}}
: {{The Linux Kernel/man|8|tc}} – traffic control
: {{w|Transport layer}} and {{w|Transmission_Control_Protocol|TCP}}
🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dudp stress-ng --udp],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dudp%2Dflood --udp-flood],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dsctp --sctp]
=== RDMA ===
🚀 advanced topic
🗝️ Acronyms:
: IB — {{w|InfiniBand}}, an interconnect standard, competes with {{w|Ethernet}}, {{w|Fibre Channel}}
: IPoIB — IP network emulation layer over InfiniBand networks
: SRP — {{w|SCSI RDMA Protocol}}
: ULP — Upper-layer protocols
: iSER — {{w|iSCSI Extensions for RDMA}}
⚲ Interfaces:
: https://github.com/linux-rdma/rdma-core
: {{The Linux Kernel/man|8|rdma}}
: {{The Linux Kernel/man|7|rdma_cm}} — RDMA communication manager
: {{The Linux Kernel/source|include/uapi/rdma}} – user-space RDMA API definitions
: {{The Linux Kernel/source|include/rdma}} – kernel RDMA API definitions
⚙️ Internals:
: {{The Linux Kernel/source|drivers/infiniband}} – InfiniBand core and drivers
:: {{The Linux Kernel/source|drivers/infiniband/ulp}} — Upper-layer protocols
:: {{The Linux Kernel/source|drivers/infiniband/sw}} — software drivers
:: {{The Linux Kernel/source|drivers/infiniband/hw}} — hardware device drivers
📚 References:
: {{The Linux Kernel/doc|InfiniBand|infiniband}}
: {{The Linux Kernel/doc|InfiniBand and RDMA Interfaces|driver-api/infiniband.html}}
== {{w|Netfilter}} ==
Netfilter is the kernel’s packet filtering and manipulation framework.
It provides hook points in the network stack where modules can inspect, modify, drop, or redirect packets.
{{w|nftables}} is the current user-facing interface, replacing the legacy {{w|iptables}}/ip6tables/ebtables/arptables tools.
{{w|Netfilter#Connection_tracking|connection tracking}} (conntrack) tracks network connections for stateful filtering and NAT.
⚲ API
: {{The Linux Kernel/man|8|nft}} – nftables rule management
: {{The Linux Kernel/man|8|iptables}}, {{The Linux Kernel/man|8|ip6tables}} – legacy packet filter
: {{The Linux Kernel/man|8|ebtables}}, {{The Linux Kernel/man|8|arptables}} – bridge and ARP filtering
: {{The Linux Kernel/man|8|ebtables-nft}}, {{The Linux Kernel/man|8|arptables-nft}}, {{The Linux Kernel/man|8|xtables-nft}} – nftables-backed compatibility
: [https://man.archlinux.org/man/ipset.8 ipset] – IP set management
: {{The Linux Kernel/man|8|conntrack}} – conntrack table management
: /proc/net/nf_conntrack – active connections
: /proc/sys/net/netfilter/ – conntrack tunables
: {{The Linux Kernel/include|linux/netfilter.h}} – hook API
:: {{The Linux Kernel/id|nf_hook_state}}, {{The Linux Kernel/id|nf_register_net_hook}}
: {{The Linux Kernel/include|uapi/linux/netfilter}}, {{The Linux Kernel/include|linux/netfilter}}
: {{The Linux Kernel/include|net/netfilter}}, {{The Linux Kernel/include|net/netns/netfilter.h}}
: {{The Linux Kernel/include|linux/netfilter/x_tables.h}} – xtables match/target registration
⚙️ Internals
: {{The Linux Kernel/source|net/netfilter}} – packet filtering framework
:: {{The Linux Kernel/source|net/netfilter/core.c}} – hook registration and dispatch
:: {{The Linux Kernel/source|net/netfilter/nf_tables_api.c}} – nftables kernel API
:: {{The Linux Kernel/source|net/netfilter/nf_tables_core.c}} – nftables rule evaluation
:: {{The Linux Kernel/source|net/netfilter/nf_conntrack_core.c}} – connection tracking core
:: {{The Linux Kernel/source|net/netfilter/nf_nat_core.c}} – {{w|Network address translation|NAT}} core
:: {{The Linux Kernel/source|net/netfilter/nf_flow_table_core.c}} – hardware offload flowtable
📖 References
: {{The Linux Kernel/doc|Netfilter Sysfs variables|networking/netfilter-sysctl.html}}
: {{The Linux Kernel/doc|Netfilter Conntrack Sysfs variables|networking/nf_conntrack-sysctl.html}}
: {{The Linux Kernel/doc|Netfilter’s flowtable infrastructure|networking/nf_flowtable.html}}
: {{w|nftables}}, https://wiki.nftables.org/
: https://lwn.net/Kernel/Index/#Networking-Packet_filtering
== Network device {{w|Network interface|interfaces}} ==
⚲ Interfaces
: <code>ip -brief link show</code>
: <code>ls -l /sys/class/net</code>
: {{The Linux Kernel/id|devm_register_netdev}} registers {{The Linux Kernel/id|net_device}}, net_device_ops
:: {{The Linux Kernel/id|dev_queue_xmit}} queues socket buffers into transmit queue
: {{The Linux Kernel/include|linux/netdevice.h}}
: {{The Linux Kernel/include|linux/skbuff.h}}
:: {{The Linux Kernel/id|sk_buff}} socket buffer (skb)
: /sys/class/net/*/statistics/ – per-interface packet and byte counters
: {{The Linux Kernel/man|8|devlink}} – manage switchdev, eswitch, shared buffers and firmware of network devices
: {{The Linux Kernel/man|8|bridge}} – show/manipulate bridge forwarding, MAC and VLAN tables
: [https://github.com/sosreport/sos/blob/main/sos/report/plugins/networking.py sos networking plugin] – diagnostics collection for network subsystem
👁 Example: {{The Linux Kernel/source|drivers/net/loopback.c}} - the most famous and simple interface '''lo'''
⚙️ Internals
: {{The Linux Kernel/source|net/core}} – core networking infrastructure
:: Device:
:: {{The Linux Kernel/source|net/core/dev.c}} – network device operations core: xmit, receive, register/unregister ({{The Linux Kernel/id|__dev_queue_xmit}}, {{The Linux Kernel/id|netif_receive_skb}})
:: ⚙️ Internals:
::: {{The Linux Kernel/id|softnet_data}} – per-CPU: poll_list, {{The Linux Kernel/id|input_pkt_queue}}, completion queue
::: {{The Linux Kernel/id|net_dev_init}} – registers {{The Linux Kernel/id|NET_RX_SOFTIRQ}} / {{The Linux Kernel/id|NET_TX_SOFTIRQ}} handlers
:::: {{The Linux Kernel/id|net_tx_action}} – TX softirq handler:
::::: frees completed skbs from {{The Linux Kernel/id|softnet_data}}→completion_queue
::::: drains {{The Linux Kernel/id|softnet_data}}→output_queue of pending qdiscs ({{The Linux Kernel/id|qdisc_run}} → driver ndo_start_xmit)
:::: {{The Linux Kernel/id|net_rx_action}} – RX softirq handler; drains up to {{The Linux Kernel/id|netdev_budget}} (300) packets
::::: {{The Linux Kernel/id|napi_poll}} → driver napi->poll()
:::::: {{The Linux Kernel/id|netif_receive_skb}} → {{The Linux Kernel/id|__netif_receive_skb_core}} → {{The Linux Kernel/id|ip_rcv}} / {{The Linux Kernel/id|ipv6_rcv}} …
::: Legacy (pre-NAPI): {{The Linux Kernel/id|netif_rx}} → {{The Linux Kernel/id|input_pkt_queue}} → backlog napi (same drain)
:: {{The Linux Kernel/include|net/neighbour.h}}, {{The Linux Kernel/source|net/core/neighbour.c}} – generic neighbour (ARP/NDP) cache ({{The Linux Kernel/id|neigh_lookup}}, {{The Linux Kernel/id|neighbour}})
:: {{The Linux Kernel/source|net/core/rtnetlink.c}} – rtnetlink: netlink interface for routing and device config ({{The Linux Kernel/id|__rtnl_register_many}})
:: {{The Linux Kernel/source|net/core/net-sysfs.c}} – /sys/class/net/ device attributes
:: {{The Linux Kernel/source|net/core/sysctl_net_core.c}} – /proc/sys/net/core/ tunables
:: Sockets:
:: {{The Linux Kernel/include|net/sock.h}}, {{The Linux Kernel/source|net/core/sock.c}} – {{The Linux Kernel/id|sock}} core: allocation, options, buffer management
:: {{The Linux Kernel/include|linux/skbuff.h}}, {{The Linux Kernel/source|net/core/skbuff.c}} – {{The Linux Kernel/id|sk_buff}} allocation, cloning, manipulation ({{The Linux Kernel/id|alloc_skb}}, {{The Linux Kernel/id|skb_clone}})
:: {{The Linux Kernel/source|net/core/datagram.c}} – generic datagram recv helpers ({{The Linux Kernel/id|skb_recv_datagram}})
:: {{The Linux Kernel/source|net/core/stream.c}} – generic stream socket helpers ({{The Linux Kernel/id|sk_stream_wait_connect}})
:: {{The Linux Kernel/source|net/core/scm.c}} – socket control message (ancillary data) handling
:: {{The Linux Kernel/include|net/sock_reuseport.h}}, {{The Linux Kernel/source|net/core/sock_reuseport.c}} – SO_REUSEPORT socket selection ({{The Linux Kernel/id|reuseport_add_sock}})
:: {{The Linux Kernel/include|linux/filter.h}}, {{The Linux Kernel/source|net/core/filter.c}} – socket filtering: BPF/cBPF/eBPF attach to sockets ({{The Linux Kernel/id|sk_filter_trim_cap}})
:: Routing / forwarding:
:: {{The Linux Kernel/include|net/dst.h}}, {{The Linux Kernel/source|net/core/dst.c}} – destination cache ({{The Linux Kernel/id|dst_entry}}, {{The Linux Kernel/id|dst_alloc}})
:: {{The Linux Kernel/include|net/flow_dissector.h}}, {{The Linux Kernel/source|net/core/flow_dissector.c}} – packet field extraction for hashing and steering ({{The Linux Kernel/id|skb_flow_dissector_init}}, {{The Linux Kernel/id|skb_flow_get_ports}})
:: {{The Linux Kernel/include|net/lwtunnel.h}}, {{The Linux Kernel/source|net/core/lwtunnel.c}} – lightweight tunnel infrastructure ({{The Linux Kernel/id|lwtunnel_build_state}})
:: {{The Linux Kernel/include|net/net_namespace.h}}, {{The Linux Kernel/source|net/core/net_namespace.c}} – network namespace lifecycle ({{The Linux Kernel/id|copy_net_ns}}, {{The Linux Kernel/id|net_ns_ops}})
:: Offload:
:: {{The Linux Kernel/source|net/core/gro.c}} – Generic Receive Offload ({{The Linux Kernel/id|gro_receive_skb}}, {{The Linux Kernel/id|dev_gro_receive}})
:: {{The Linux Kernel/source|net/core/gso.c}} – Generic Segmentation Offload ({{The Linux Kernel/id|__skb_gso_segment}}, {{The Linux Kernel/id|skb_mac_gso_segment}})
:: {{The Linux Kernel/include|net/xdp.h}}, {{The Linux Kernel/source|net/core/xdp.c}} – XDP buffer and memory model ({{The Linux Kernel/id|xdp_rxq_info}}, {{The Linux Kernel/id|xdp_buff}})
:: {{The Linux Kernel/include|net/page_pool/types.h}}, {{The Linux Kernel/source|net/core/page_pool.c}} – page pool allocator for zero-copy RX ({{The Linux Kernel/id|page_pool_create}})
:: Diagnostics / tools:
:: {{The Linux Kernel/source|net/core/secure_seq.c}} – ISN and port randomization ({{The Linux Kernel/id|secure_tcp_seq_and_ts_off}}, {{The Linux Kernel/id|secure_ipv4_port_ephemeral}})
:: {{The Linux Kernel/source|net/core/netpoll.c}} – network console / crash dump transport ({{The Linux Kernel/id|netpoll_send_skb}})
:: {{The Linux Kernel/source|net/core/drop_monitor.c}} – kfree_skb drop event monitor ({{The Linux Kernel/id|send_dm_alert}}, {{The Linux Kernel/id|net_dm_alert_summary_ops}})
:: {{The Linux Kernel/source|net/core/pktgen.c}} – in-kernel packet generator ({{The Linux Kernel/man|8|pktgen}})
:: {{The Linux Kernel/source|net/core/timestamping.c}} – SO_TIMESTAMPING and PHY timestamping helpers
: function {{The Linux Kernel/id|loopback_xmit}} receives skb and passes it back with {{The Linux Kernel/id|netif_rx}}
🔨 [https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Drawsock stress-ng --rawsock],
[https://manpages.ubuntu.com/manpages/resolute/man1/stress-ng.1.html#:~:text=%2D%2Dicmp%2Dflood --icmp-flood]
📚 Further reading
: {{The Linux Kernel/man|8|ip-link}} – network device configuration
: {{The Linux Kernel/man|8|ip-stats}} – manage and show interface statistics
: {{The Linux Kernel/man|7|netdevice}} – low-level access to Linux network devices
: {{The Linux Kernel/man|7|packet}} – packet interface on device level
: [https://www.coverfire.com/articles/queueing-in-the-linux-network-stack/ Queueing in the Linux Network Stack]
💾 Historical
: [http://www.tldp.org/LDP/tlk/net/net.html LDP TLK Chapter 10 Networks]
== Network drivers==
: {{The Linux Kernel/include|linux/if_ether.h}} – IEEE 802.3 Ethernet constants and header
:{{The Linux Kernel/include|linux/etherdevice.h}}
: {{w|New_API|NAPI}}
: [https://wiki.linuxfoundation.org/networking/napi NAPI Driver design]
:: ⚲ API:
::: {{The Linux Kernel/id|netif_napi_add}} – registers {{The Linux Kernel/id|napi_struct}}, stores driver poll_fn as napi->poll
::: {{The Linux Kernel/id|napi_schedule}} – raises {{The Linux Kernel/id|NET_RX_SOFTIRQ}} from IRQ handler
::: {{The Linux Kernel/id|netif_receive_skb}} – delivers skb to protocol handlers
::: {{The Linux Kernel/id|napi_complete_done}} – signals poll() exhausted its quota
:: ⚙️ Internals:
::: {{The Linux Kernel/id|net_dev_init}} – registers softirq handlers, sets up per-CPU {{The Linux Kernel/id|softnet_data}}
:::: {{The Linux Kernel/id|napi_poll}} – calls driver napi->poll(), enforces budget
:: 👁 example
::: {{The Linux Kernel/id|e1000_intr}} → {{The Linux Kernel/id|__napi_schedule}}
::: {{The Linux Kernel/id|e1000e_poll}} (napi->poll()) → {{The Linux Kernel/id|napi_complete_done}}
: {{The Linux Kernel/id|ether_setup}} setups Ethernet network device
: 👁 An example of Ethernet driver: {{The Linux Kernel/id|e1000_probe}}
⚙️ Internals:
: {{The Linux Kernel/source|drivers/net}} – network device drivers
: {{The Linux Kernel/source|drivers/net/wireless}} – wireless drivers
: {{The Linux Kernel/source|drivers/net/ethernet}} – Ethernet drivers
: {{The Linux Kernel/source|net/wireless}} – cfg80211, wireless configuration API and userspace interface via {{The Linux Kernel/man|8|iw}}
: {{The Linux Kernel/source|net/mac80211}} – mac80211, software 802.11 MAC layer used by most WiFi drivers
: {{The Linux Kernel/source|net/bluetooth}} – {{w|Bluetooth}} protocol stack
: {{The Linux Kernel/source|net/bridge}} – {{The Linux Kernel/doc|Ethernet bridging|networking/bridge.html}}
📚 References:
: {{The Linux Kernel/man|8|ethtool}} – query or control network driver and hardware settings
: [[w:Data link layer|Data link layer]]: [[w:Ethernet|Ethernet]]
: [https://lwn.net/Articles/358910/ GRO - Generic Receive Offload]
: {{The Linux Kernel/doc|Segmentation Offloads|networking/segmentation-offloads.html}}
: https://wireless.wiki.kernel.org
<hr>
📚 Further reading
: [https://sysprog21.github.io/lkmpg/#network-drivers LKMPG: Network Drivers]
💾 ''Historical'':
: [http://www.xml.com/ldd/chapter/book/ch14.html LDD2:Network Drivers]
: [http://lwn.net/images/pdf/LDD3/ch17.pdf LDD3:Network Drivers]
: [http://www.tldp.org/HOWTO/KernelAnalysis-HOWTO-8.html Kernel Analysis: Networking, 2003]
: [https://web.archive.org/web/20111030030517/http://www.linuxfoundation.org/collaborate/workgroups/networking/networkoverview network_overview]
📖 Further reading about networking
: {{The Linux Kernel/doc|Networking interfaces|subsystem-apis.html#networking-interfaces}}
:: {{The Linux Kernel/doc|Networking|networking}}
: https://lwn.net/Kernel/Index/#Networking
: https://lartc.org/ – Linux Advanced Routing & Traffic Control
: {{The Linux Kernel/man|8|ip}} – show / manipulate routing, network devices, interfaces and tunnels
: {{The Linux Kernel/man|8|tc}} – show / manipulate traffic control settings
: [https://github.com/iovisor/bcc/blob/master/README.md#network-and-sockets-tools bcc/ebpf networking tools]
: [https://github.com/cilium/cilium eBPF-based Networking, Security, and Observability]
: [https://retis.readthedocs.io/ Retis – tracing packets in the Linux networking stack & friends]
{{BookCat}}
0y6zym8uwrv9yg8dntx9w4infif4ees
GLPK/Application projects utilizing GLPK
0
233717
4669623
4667227
2026-09-10T17:51:57Z
WereSpielChequers
248949
typo
4669623
wikitext
text/x-wiki
A number of application programming projects rely on GLPK to solve their underlying optimization problems. A few projects are listed here. Some have been released, others represent work in progress. The programming
languages include C++ (native linking) and Java (with the appropriate [[GLPK/Language_Bindings|language bindings]]).
As can be seen, the application domain is quite varied.
Designing and programming models which use the GLPK API is rather different from writing models in MathProg. If you are unsure about which approach to use, then almost certainly MathProg would be the better option.
{{TODO|• add your GLPK-based project to this page !!}}
== Application projects ==
=== Clepsydra ===
[http://volta.sourceforge.net/doc/manual/multi-page/ch04.html Clepsydra]
is a static
[[w:Worst-case_execution_time|worst-case execution time]]
analyzer for the
[[w:Java_optimized_processor|Java Optimized Processor]].
It uses GLPK's integer linear programming to find the
longest path through a program's '''control flow graph'''.
=== cspsol ===
[http://code.google.com/p/cspsol/ cspsol]
is a '''cutting stock problem solver''' which uses
GLPK. The
[http://neos.mcs.anl.gov/CaseStudies/cutting/ cutting stock problem]
(CSP) attempts to find the best way of cutting a set of
large objects into smaller items. Such tasks are
common in manufacturing.
=== OSEMOSYS ===
[http://osmosys.yolasite.com/ OSEMOSYS]
is a major open source '''energy modeling system''',
based on partial (economic) equilibrium.
<ref>{{cite book | last1 = Howells | first1 = M. | last2 = Rogner | first2 = H.H. | last3 = Jalal | first3 = I. | last4 = Isshiki | first4 = M. | title = An open source energy planning approach : SOFT-MESSAGE | url= http://www.iea.org/Textbase/work/2008/iew/Wednesday/Howells.pdf | type = presentation | year = 2008 | month=
June}}</ref>
The model draws inspiration from
[http://www.iiasa.ac.at/Research/ECS/docs/models.html#MESSAGE MESSAGE]
and the model "envelope" is written in Java.
The project has an associated
[http://osemosysforum.wikispaces.com/ wiki].
=== Praat ===
[http://praat.org Praat]
is a '''computational phonetics''' project, based at
the
[http://www.fon.hum.uva.nl/ Institute of Phonetic Sciences],
University of Amsterdam. Praat is used to study human
speech analysis and synthesis. Praat uses GLPK to find
the minimal positive weights for problems involving
harmonic grammar.
=== Shogun ===
The [http://www.shogun-toolbox.org/ shogun] project provides
a toolbox with algorithms for machine learning. GLPK is
one of the solvers that can be used for multiple
kernel learning.
=== stan ===
The
[http://sourceforge.net/projects/stan stan]
project is a java decision support application for the
'''urban planning''' domain. It is designed as a
desktop front-end to a mixed integer programming engine
and currently uses GLPK.
=== TEMOA ===
The
[http://www.temoaproject.org/ TEMOA Project]
provides tools for '''energy model optimization''' and
analysis.
<ref> {{cite conference | url = http://www.kth.se/polopoly_fs/1.61926!E1_DeCarolis.pdf | title = The TEMOA project : tools for energy model optimization and analysis | first1 = DeCarolis | last1 = Joseph | first2 = Hunter | last2 = Kevin | first3 = Sreepathi | last3 = Sarat | date = 21-23 June 2010 | date = June 2010| conference = International Energy Workshop 2010 | location = Stockholm, Sweden}}</ref>
TEMOA uses
[http://software.sandia.gov/trac/coopr/wiki/Pyomo Pyomo]
which, in turn, defaults to GLPK (however future
developments may require the use of nonlinear solvers).
The design of TEMOA is strongly influenced by the
well-documented
[http://www.etsap.org/Tools.asp MARKAL/TIMES]
model generators. The project has an associated
[http://wiki.temoaproject.org/ wiki].
=== xeona ===
''xeona'' is a part-complete '''energy system'''
simulation project designed to support energy and
climate policy development. ''xeona'' uses GLPK to
solve a number of technical and microeconomic
subproblems within a system traversal process that also
tries to make best use of standing capacity and
intermittent resources. The application is written in
C++ and is strongly object-oriented. The GLPK solver
itself is encapsulated in a semi-intelligent wrapper
class named <code>svif::SiGlpk</code> which exposes a more
convenient call set than the one provided by GLPK
directly. ''xeona'' can also output table-based HTML
representations of each GLPK subproblem encountered
— a feature which has proved itself invaluable
when debugging. ''xeona'' is being developed by Robbie
Morrison. This codebase is due to be open-sourced at
the end of 2010. There is no associated website.
=== KuKu3 ===
https://sourceforge.net/projects/kuku3/
KuKu3 uses glpk to solve various puzzles.
Version 3.2.1 provides:
Incorporates Sudoku into Internet Explorer or Firefox.
Solves Gattai5 (Samuri Sudoku) Puzzles. Additional puzzles can be obtained from (http://www.samurai-sudoku.com/)
Solves Hidato Puzzles. Additional puzzles can be obtained from http://www.smithsonianmag.com/games/hidato.html
Solves Numbrix Puzzles. Additional puzzles can be obtained from http://www.latimes.com/games/numbrix/
Source code for Gattai5 is available as Visual Studio solutions in the sources directory.
Source code for Hidato/Numbrix is available as a QT4 project in the sources directory
The binary distribution should be unzipped to C:\KuKu3. It requires dotNetFx40.
ieSudoku is started by dropping the file C:\KuKu3\iesudoku\iesudoku (XAML Browser Application) onto Internet Explorer or Firefox (Plugin required)
Version 3.3.0 adds support for Set Square, source available as a Visual Studio 10 project in the source directory.
Version 3.4.0 adds support for Futoshiki. Ada source available in the source directory requires gtkAda. Additional puzzles can be found at http://www.thepuzzleclub.com/futoshiki.php
== References ==
{{reflist}}
{{BookCat}}
6gfrhlcjvxle3nsq9d0tnd0c7681mld
Aros/User/Applications
0
237399
4669661
4669455
2026-09-11T10:15:29Z
Jeff1138
301139
4669661
wikitext
text/x-wiki
==Introduction==
[[#Graphical Image Editing Art]]
[[#Office Application]]
[[#Audio]]
[[#Misc Application]]
[[#Games & Emulation]]
[[#Application Guides]]
[[#top|...to the top]]
[[#top|...to the top]]
Most apps can be opened on the Workbench (aka publicscreen pubscreen) which is the default display option but can offer a custom one set to your configurations (aka custom screen mode promotion). These custom ones tend to stack so the possible use of A-M/A-N method of switching between full screens and the ability to pull down screens as well
If you are interested in creating or porting new software, see [http://en.wikibooks.org/wiki/Aros/Developer/Docs here]
{| class="wikitable sortable"
|-
!width:30%;|Internet Applications
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1 (68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Web Online Browser [],
|<!--AROS-->Odyssey 2.0, [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1175&highlight=odyssey&rowstart=100 Odyssey 3.0], [https://juen.in/ Amelinium], [],
|<!--Amiga OS-->[https://aminet.net/comm/www Amelinium], [https://blog.alb42.de/programs/amifox/ amifox] with [https://github.com/alb42/wrp wrp server], IBrowse*, Voyager*, [https://github.com/amigazen/aweb3/ AWeb 3.6 src], [https://github.com/matjam/aweb AWeb Src], [http://aminet.net/package/comm/www/NetSurf-m68k-sources Netsurf], [],
|<!--AmigaOS4-->[ Odyssey OWB], [ Timberwolf (Firefox port 2011)], [http://amigaworld.net/modules/newbb/viewtopic.php?forum=32&topic_id=32847 OWB-mui], [http://strohmayer.org/owb/ OWB-Reaction], IBrowse*, [http://os4depot.net/index.php?function=showfile&file=network/browser/aweb.lha AWeb], Voyager, [http://www.os4depot.net/index.php?function=browse&cat=network/browser Netsurf],
|<!--MorphOS-->Wayfarer, [http://fabportnawak.free.fr/owb/ Odyssey OWB], [ Netsurf], IBrowse*, AWeb, [],
|-
|<!--Sub Menu-->YouTube, Dailymotion website downloading videos audio [https://github.com/yt-dlp/yt-dlp yt-dlp], [https://clipgrab.org/ clipgrab],
|<!--AROS-->[], [https://blog.alb42.de/amitube/ Amitube],
|<!--Amiga OS-->[https://blog.alb42.de/amitube/ Amitube], [ smtube],
|<!--AmigaOS4-->[https://blog.alb42.de/amitube/ Amitube], getVideo, Tubexx, [https://github.com/walkero-gr/aiostreams aiostreams],
|<!--MorphOS-->[ ytsearch], [https://blog.alb42.de/amitube/ Amitube], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 getVideo], Tubexx
|-
|<!--Sub Menu-->Old style E-mailing SMTP POP3 IMAP based
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/email SimpleMail], [http://sourceforge.net/projects/simplemail/files/ src], [https://github.com/jens-maus/yam YAM]
|<!--Amiga OS-->[http://sourceforge.net/projects/simplemail/files/ SimpleMail], [https://github.com/jens-maus/yam YAM]
|<!--AmigaOS4-->SimpleMail, YAM,
|<!--MorphOS--> SimpleMail, YAM
|-
|<!--Sub Menu-->IRC, ICB,
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/chat WookieChat], [https://sourceforge.net/projects/wookiechat/ Wookiechat src], [http://archives.arosworld.org/index.php?function=browse&cat=network/chat AiRcOS], Jabberwocky,
|<!--Amiga OS-->Wookiechat, AmIRC
|<!--AmigaOS4-->Wookiechat
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=5 Wookiechat], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 AmIRC],
|-
|<!--Sub Menu-->Instant Messaging IM like [https://github.com/BlitterStudio/amidon Hollywood lang based Mastodon client], BlueSky AT protocol, Facebook(TM), Twitter X (TM), Bitlbee IRC Gateway and others
|<!--AROS-->[https://github.com/kaffeine1/telegram-amiga telegram-amiga], [http://archives.arosworld.org/index.php?function=browse&cat=network/chat jabberwocky],
|<!--Amiga OS-->[http://amitwitter.sourceforge.net/ AmiTwitter], CLIMM, SabreMSN, jabberwocky,
|<!--AmigaOS4-->[http://amitwitter.sourceforge.net/ AmiTwitter], SabreMSN,
|<!--MorphOS-->[http://amitwitter.sourceforge.net/ AmiTwitter], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 PolyglotNG], SabreMSN,
|-
|<!--Sub Menu-->Torrents
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/p2p ArTorr],
|<!--Amiga OS-->
|<!--AmigaOS4-->CTorrent, Transmission
|<!--MorphOS-->MLDonkey, Beehive, [http://morphos.lukysoft.cz/en/vypis.php?kat=5 Transmission], CTorrent,
|-
|<!--Sub Menu-->FTP
|<!--AROS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], MarranoFTP,
|<!--Amiga OS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], [http://aminet.net/package/comm/tcp/AmiFTP AmiFTP], AmiTradeCenter, ncFTP,
|<!--AmigaOS4-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan],
|<!--MorphOS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 Pftp], [http://aminet.net/package/comm/tcp/AmiFTP-1.935-OS4 AmiFTP],
|-
|<!--Sub Menu-->WYSIWYG Web Site Editor
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Internet Radio Streaming Audio [http://www.gnu.org/software/gnump3d/ gnump3d], [http://www.icecast.org/ Icecast2] Server (Broadcast) and Client (Listen), [ mpd], [http://darkice.sourceforge.net/ DarkIce], [http://www.dyne.org/software/muse/ Muse],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/misc], Mplayer (Icecast Client only),
|<!--Amiga OS-->[https://github.com/sandlbn/TuneFinder TuneFinder C Src], [https://github.com/sandlbn/TuneFinderMUI TuneFinderMUI], [http://amigazeux.net/anr/ AmiNetRadio], [], [],
|<!--AmigaOS4-->[http://www.tunenet.co.uk/ Tunenet],
|<!--MorphOS-->Mplayer, AmiNetRadio,
|-
|<!--Sub Menu-->VoIP (Voice over IP) with SIP Client (Session Initiation Protocol) or Asterisk IAX2 Clients Softphone (skype like)
|<!--AROS-->
|<!--Amiga OS-->AmiPhone with Speak Freely,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Weather Forecast
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ WeatherBar], [http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench AWeather], []
|<!--Amiga OS-->[http://amigazeux.net/wetter/ Wetter], [https://github.com/emartisoft/AmiWeatherForecasts AmiWeatherForecasts src],
|<!--AmigaOS4-->[http://os4depot.net/?function=showfile&file=utility/workbench/flipclock.lha FlipClock],
|<!--MorphOS-->[http://amigazeux.net/wetter/ Wetter],
|-
|<!--Sub Menu-->Street Road Maps Route Planning GPS Tracking
|<!--AROS-->[https://blog.alb42.de/programs/muimapparium/ MuiMapparium] [https://build.alb42.de/ Build of MuiMapp versions],
|<!--Amiga OS-->AmiAtlas*, UKRoutePlus*, [http://blog.alb42.de/ AmOSM],
|<!--AmigaOS4-->
|<!--MorphOS-->[http://blog.alb42.de/programs/mapparium/ Mapparium],
|-
|<!--Sub Menu-->Clock and Date setting from the internet (either ntp or websites) [https://www.timeanddate.com/worldclock/ World Clock], [http://www.time.gov/ NIST], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/misc ntpsync],
|<!--Amiga OS-->ntpsync
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Newsgroups
|<!--AROS-->
|<!--Amiga OS-->[http://newscoaster.sourceforge.net/ Newscoaster], [https://github.com/jens-maus/newsrog NewsRog], [ WorldNews],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->RSS
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/Team-Boingo/AmiRSS AmiRSS src]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->AI
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/murinsel/AmigaAI Claude], [https://github.com/geekychris/amiga_mcp AI on host machine], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->BBS
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Graphical Image Editing Art==
{| class="wikitable sortable"
|-
!width:30%;|Image Editing
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Pixel Raster Artwork [https://github.com/LibreSprite/LibreSprite LibreSprite based on GPL aseprite], [https://github.com/abetusk/hsvhero hsvhero], [],
|<!--AROS-->[https://sourceforge.net/projects/zunetools/files/ZunePaint/ ZunePaint], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit LunaPaint], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit GrafX2], [ LodePaint needs OpenGL],
|<!--Amiga OS-->[http://www.amigaforever.com/classic/download.html PPaint], GrafX2, [https://github.com/grovdata/Amiga_Sources/blob/master/software.md DeluxePaint], [http://www.amiforce.de/perfectpaint/perfectpaint.php PerfectPaint], Zoetrope, Brilliance2*,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=graphics/edit LodePaint], GrafX2,
|<!--MorphOS-->Sketch, Pixel*, GrafX2, [http://morphos.lukysoft.cz/en/vypis.php?kat=3 LunaPaint]
|-
|<!--Sub Menu-->Image viewing
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ ZuneView], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer LookHere], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer LoView], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer PicShow] , [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album],
|<!--Amiga OS-->PicShow, PicView, Photoalbum,
|<!--AmigaOS4-->WarpView, PicShow, flPhoto, Thumbs, [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 ShowGirls], [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album]
|-
|<!--Sub Menu-->Photography retouching / Image Manipulation like Photoshop(tm)
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit RNOEffects],
|<!--Amiga OS-->[ Tecsoft Video Paint aka TVPaint], Photogenics*, ArtEffect*, ImageFX*, XiPaint, fxPaint, ImageMasterRT, Opalpaint,
|<!--AmigaOS4-->WarpView, flPhoto, [http://www.os4depot.net/index.php?function=browse&cat=graphics/edit Photocrop]
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 ShowGirls], ImageFX*,
|-
|<!--Sub Menu-->Manage RAW picture folder galleries like Darktable, RAWtherapy, etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Graphic Format Converter - ICC profile support sRGB, Adobe RGB, XYZ and linear RGB
|<!--AROS-->
|<!--Amiga OS-->GraphicsConverter, ImageStudio, [http://www.coplabs.org/artpro.html ArtPro]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Thumbnail Generator [],
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ ZuneView], [http://archives.arosworld.org/index.php?function=browse&cat=utility/shell Thumbnail Generator]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Icon Editor
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/iconedit Archives], [http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench Icon Toolbox],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=graphics/iconedit IconEditor]
|<!--MorphOS-->
|-
|<!--Sub Menu-->2D Pixel Art Animation
|<!--AROS-->Lunapaint
|<!--Amiga OS-->PPaint, AnimatED, Scala*, GoldDisk MovieSetter*, Walt Disney's Animation Studio*, ProDAD*, [https://github.com/historicalsource/DeluxePaint DeluxePaint src], Brilliance
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 Titler]
|-
|<!--Sub Menu-->2D SVG based MovieSetter type
|<!--AROS-->
|<!--Amiga OS-->MovieSetter*, Fantavision*
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Morphing
|<!--AROS-->[ GLMorph]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->2D Cad (qcad->LibreCAD, etc.)
|<!--AROS-->
|<!--Amiga OS-->Xcad, MaxonCAD
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Cad like FreeCad, BRL-CAD, OpenSCAD, AvoCADo, etc. using dxf, obj (vertices), blend,
|<!--AROS-->
|<!--Amiga OS-->XCad3d*, DynaCADD*, Cycas,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Model Rendering of glft (json) gbl (png jpg), usdz (USD files with materials, textures, and animations), FBX Filmbox is a proprietary Autodesk format,
|<!--AROS-->POV-Ray
|<!--Amiga OS-->[http://www.discreetfx.com./amigaproducts.html CINEMA 4D]*, POV-Ray, Lightwave3D*, Real3D*, Caligari24*, Reflections/Monzoom*, [https://github.com/privatosan/RayStorm Raystorm src], Tornado 3D
|<!--AmigaOS4-->Blender, POV-Ray, Yafray
|<!--MorphOS-->Blender, POV-Ray, Yafray
|-
|<!--Sub Menu-->3D Format Converter [], [],
|<!--AROS-->[https://archives.arosworld.org/?function=showfile&file=graphics/convert/ 3doc.i386-aros], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=showfile&file=graphics/convert/ivcon.lha IVCon]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen grabbing display
|<!--AROS-->[ Screengrabber], [http://archives.arosworld.org/index.php?function=browse&cat=utility/misc snapit], [http://archives.arosworld.org/index.php?function=browse&cat=video/record screen recorder], []
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Grab graphics music from apps [https://github.com/Malvineous/ripper6 ripper6], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Office Application==
{| class="wikitable sortable"
|-
!width:30%;|Office
!width:10%;|AROS (x86)
!width:10%;|[http://en.wikipedia.org/wiki/Amiga_software Commodore-Amiga OS 3.1] (68k)
!width:10%;|[http://en.wikipedia.org/wiki/AmigaOS_4 Hyperion OS4] (PPC)
!width:10%;|[http://en.wikipedia.org/wiki/MorphOS MorphOS] (PPC)
|-
|<!--Sub Menu-->Office Suite
|<!--AROS-->
|<!--Amiga OS-->[ Softwood Final Office], [ Wordworth Office], [ Digita Office], [ The Works!], [ Europress Mini Office], [], [ Papyrus Office Demo],
|<!--AmigaOS4-->
|<!--MorphOS-->[ Papyrus Office],
|-
|<!--Sub Menu-->Word-processing
|<!--AROS-->[https://finalwriter.godaddysites.com/ Final Writer 7*], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1995&rowstart=20&pid=12668#post_12668 Slovo], [https://github.com/sodero/MUI-Vim/releases MUI-Vim], [https://archives.arosworld.org/index.php?function=browse&cat=office/wordprocessing Cinnamon Writer], [],
|<!--AmigaOS-->[ Softwood FinalCopy II*], Haage AmigaWriter*, Digita WordWorth*, Softwood FinalWriter*, Micro-Systems Excellence 3*, Arnor Protext, Rashumon, [ InterWord], [ KindWords], [WordPerfect], [ New Horizons Flow], [ CygnusEd Pro], [ Micro-systems Scribble],
|<!--AmigaOS4-->AbiWord, [ CinnamonWriter],
|<!--MorphOS-->[ Cinnamon Writer], [http://www.meta-morphos.org/viewtopic.php?topic=1246&forum=53 scriba], [http://morphos.lukysoft.cz/en/index.php Papyrus Office],
|-
|<!--Sub Menu-->Spreadsheets
|<!--AROS-->[https://blog.alb42.de/programs/leu/ Leu], [https://archives.arosworld.org/index.php?function=browse&cat=office/spreadsheet ],
|<!--AmigaOS-->[https://aminet.net/package/biz/spread/ignition-src Ignition Src 1.3], [MaxiPlan 500 Plus], [OXXI Plan/IT v2.0 Speadsheet], [ Superplan], [ Creative Developments TurboCalc], [ ProCalc], [ InterSpread], [Digita DGCalc], [ Gold Disk Advantage], [ Micro-systems Analyze!]
|<!--AmigaOS4-->Gnumeric, [https://ignition-amiga.sourceforge.net/ Ignition],
|<!--MorphOS-->[ ignition], [http://morphos.lukysoft.cz/en/vypis.php Papyrus Office],
|-
|<!--Sub Menu-->Presentations
|<!--AROS-->[http://www.hollywoood-mal.com/ Hollywood]*,
|<!--Amiga OS-->[http://www.hollywoood-mal.com/ Hollywood]*, MediaPoint, PointRider, Scala*,
|<!--Amiga OS4-->[http://www.hollywoood-mal.com/ Hollywood]*, PointRider
|<!--MorphOS-->[http://www.hollywoood-mal.com/ Hollywood]*, PointRider
|-
|<!--Sub Menu-->Databases
|<!--AROS-->[http://sdb.freeforums.org/ SDB], [http://archives.arosworld.org/index.php?function=browse&cat=office/database BeeBase],
|<!--Amiga OS-->Precision Superbase 4 Pro*, Arnor Prodata*, BeeBase, Datastore, FinalData*, AmigaBase, Fiasco, Twist2*, [Digita DGBase], [],
|<!--AmigaOS4-->BeeBase, SQLite,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=6 BeeBase],
|-
|<!--Sub Menu-->PDF Viewing and editing digital signatures
|<!--AROS-->[http://sourceforge.net/projects/arospdf/ ArosPDF via splash], [https://github.com/wattoc/AROS-vpdf vpdf wip],
|<!--Amiga OS-->APDF
|<!--AmigaOS4-->AmiPDF
|<!--MorphOS-->APDF, vPDF,
|-
|<!--Sub Menu-->Note Taking markdown support like Obsidian like, joplin, OneNote, EverNotes, xournalpp, etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Study and analyse, collect, organize, annotate, cite, and share
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->PIM Personal Information Manager - Day Diary Planner Calendar App
|<!--AROS-->[ ], [ ], [ ],
|<!--Amiga OS-->Digita Organiser*, On The Ball, Everyday Organiser, [ Contact Manager],
|<!--AmigaOS4-->AOrganiser,
|<!--MorphOS-->[http://polymere.free.fr/orga_en.html PolyOrga],
|-
|<!--Sub Menu-->Accounting
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=office/misc ETB], LoanCalc, [ ], [ ], [ ],
|[ Digita Home Accounts2], Accountant, Small Business Accounts, Account Master, [ Amigabok],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Project Management Research
|<!--AROS-->
|<!--Amiga OS-->SuperGantt, SuperPlan,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Desktop
|<!--AROS-->Wanderer, Scalos, Workbook, DOpus5,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[https://github.com/zapek/Ambient Ambient Src]
|-
|<!--Sub Menu-->System Wide Search
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=utility/filetool Finder], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System Wide Dictionary - multilingual [http://sourceforge.net/projects/babiloo/ Babiloo], [http://code.google.com/p/stardict-3/ StarDict],
|<!--AROS-->[ ],
|<!--AmigaOS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System wide Thesaurus - multi lingual
|<!--AROS-->[ ],
|Kuma K-Roget*,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Sticky Desktop Notes (post it type)
|<!--AROS-->[http://aminet.net/package/util/wb/amimemos.i386-aros AmiMemos], [https://aminet.net/package/util/wb/amimemos.src-aros AmiMemos Src], [],
|<!--Amiga OS-->[http://aminet.net/package/util/wb/StickIt-2.00 StickIt v2],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->DTP Desktop Publishing
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit RNOPublisher],
|<!--Amiga OS-->[http://pagestream.org/ Pagestream]*, Professional Pro Page*, Saxon Publisher, Pagesetter, PenPal,
|<!--AmigaOS4-->[http://pagestream.org/ Pagestream]*
|<!--MorphOS-->[http://pagestream.org/ Pagestream]*
|-
|<!--Sub Menu-->Printing
|<!--AROS-->Postscript 3 laser printers, [https://github.com/bohunamiga/MintPRINT MintPRINT AirPrint IPP], [ Ghostscript], [],
|<!--Amiga OS-->[https://github.com/boingball/MintPRINT MintPRINT IPP], [https://github.com/Andiweli/AmiAirprint AmiAirprint], [http://www.irseesoft.de/tp_what.htm TurboPrint]*, [ GutenPrint], [https://aminet.net/package/comm/tcp/NetPrinter NetPrinter LPR], [], [],
|<!--AmigaOS4-->(some native drivers),
|<!--MorphOS-->early TurboPrint included, [https://aminet.net/package/comm/tcp/NetPrinter NetPrinter LPR],
|-
|<!--Sub Menu-->Scanning
|<!--AROS-->[ SCANdal], [],
|<!--Amiga OS-->FxScan*, ScanQuix*
|<!--AmigaOS4-->SCANdal (Sane)
|<!--MorphOS-->SCANdal
|-
|<!--Sub Menu-->OCR
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/convert gOCR]
|<!--AmigaOS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos-files.net/categories/office/text Tesseract]
|-
|<!--Sub Menu-->Text Editing
|<!--AROS-->Jano Editor (already installed as Editor), [http://archives.arosworld.org/index.php?function=browse&cat=development/edit EdiSyn], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit Annotate], [https://archives.arosworld.org/index.php?function=browse&cat=development/edit Vim], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit FrexxEd] [https://github.com/vidarh/FrexxEd src], [ NoWinEd],
|<!--Amiga OS-->[https://aminet.net/package/text/edit/TurboText20 TurboText20 ttx], Annotate, MicroGoldED/CubicIDE*, CygnusED*, Protext*, NoWinED,
|<!--AmigaOS4-->Notepad, Annotate, CygnusED*, NoWinED,
|<!--MorphOS-->MorphOS ED, NoWinED, GoldED/CubicIDE*, CygnusED*, Annotate,
|-
|<!--Sub Menu-->Office Fonts [http://sourceforge.net/projects/fontforge/files/fontforge-source/ Font Designer]
|<!--AROS-->[ ], [ ],
|<!--Amiga OS-->TypeSmith*, SaxonScript (GetFont Adobe Type 1),
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Drawing Vector
|<!--AROS-->[http://sourceforge.net/projects/amifig/ ZuneFIG previously AmiFIG], [https://github.com/serk118/designworks-aros designworks aros 64bit]
|<!--Amiga OS-->Drawstudio*, ProVector*, ArtExpression*, Professional Draw*, AmiFIG, MetaView, [https://gitlab.com/amigasourcecodepreservation/designworks Design Works Src], [],
|<!--AmigaOS4-->MindSpace, [http://www.os4depot.net/index.php?function=browse&cat=graphics/edit amifig],
|<!--MorphOS-->SteamDraw, [http://aminet.net/package/gfx/edit/amifig amiFIG],
|-
|<!--Sub Menu-->video conferencing (jitsi)
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->source code hosting
|<!--AROS-->Gitlab,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Remote Desktop (server)
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/VNC_Server ArosVNCServer],
|<!--Amiga OS-->[http://s.guillard.free.fr/AmiVNC/AmiVNC.htm AmiVNC], [http://dspach.free.fr/amiga/avnc/index.html AVNC]
|<!--AmigaOS4-->[http://s.guillard.free.fr/AmiVNC/AmiVNC.htm AmiVNC]
|MorphVNC, vncserver
|-
|<!--Sub Menu-->Remote Desktop (client) login and connect to another machine
|<!--AROS-->[https://sourceforge.net/projects/zunetools/files/VNC_Client/ ArosVNC], [http://archives.arosworld.org/index.php?function=browse&cat=network/misc rdesktop],
|<!--Amiga OS-->[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://dspach.free.fr/amiga/vva/index.html VVA], [http://www.hd-zone.com/ RDesktop]
|<!--AmigaOS4-->[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://www.hd-zone.com/ RDesktop]
|[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://www.hd-zone.com/ RDesktop]
|-
|<!--Sub Menu-->notifications
|<!--AROS-->
|<!--Amiga OS-->Ranchero
|<!--AmigaOS4-->Ringhio
|<!--MorphOS-->MagicBeacon
|-
|<!--Sub Menu-->Biometric facial logins and fingerprint security features
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Audio==
{| class="wikitable sortable"
|-
!width:30%;|Audio
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Playing playback Audio like MP3, [https://github.com/chrg127/gmplayer NSF], [https://github.com/kode54/lazyusf miniusf .usflib] [https://gitlab.com/kode54/psflib with pfslib], [], [], etc
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/play Mplayer], [ HarmonyPlayer hp], [http://www.a500.org/downloads/audio/index.xhtml playcdda] CDs, [ WildMidi Player], [https://bszili.morphos.me/ UADE mod player], [], [ RNOTunes], [ mp3Player], [],
|<!--Amiga OS-->AmiNetRadio, AmigaAmp, playOGG, [https://codeberg.org/tygre/amimodradio amimodradio]
|<!--AmigaOS4-->TuneNet, SimplePlay, AmigaAmp, TKPlayer
|AmiNetRadio, Mplayer, Kaya, AmigaAmp
|-
|<!--Sub Menu-->Editing Audio
|<!--AROS-->[ Audio Evolution 4]
|<!--Amiga OS-->[https://sourceforge.net/projects/hd-rec/ HD-Rec Src], [http://www.sonicpulse.de/eng/news.html SoundFX], [ Samplitude],
|<!--AmigaOS4-->[https://sourceforge.net/projects/hd-rec/ HD-Rec], AmiSoundED, [http://os4depot.net/?function=showfile&file=audio/record/audioevolution4.lha Audio Evolution 4]
|[http://www.hd-rec.de/HD-Rec/index.php?site=home HD-Rec],
|-
|<!--Sub Menu-->Editing Tracker Music
|<!--AROS-->[https://github.com/hitchhikr/protrekkr Protrekkr], [ Schism Tracker], [http://archives.arosworld.org/index.php?function=browse&cat=audio/tracker MilkyTracker], [http://www.hivelytracker.com/ HivelyTracker], [ Radium in AROS already], [http://www.a500.org/downloads/development/index.xhtml libMikMod],
|<!--Amiga OS-->MilkyTracker, HivelyTracker, DigiBooster, Octamed SoundStudio, [https://github.com/elindstrom/soundtracker soundtracker],
|<!--AmigaOS4-->MilkyTracker, HivelyTracker, GoatTracker
|MilkyTracker, GoatTracker, DigiBooster,
|-
|<!--Sub Menu-->Editing Music [], [https://github.com/kmatheussen/camd CAMD] and/or staves and musical notes on manuscript
|<!--AROS-->[http://bnp.hansfaust.de/ Bars and Pipes], [], [],
|<!--Amiga OS-->[http://bnp.hansfaust.de/ Bars'n'Pipes], MusicX* David "Talin" Joiner & Craig Weeks (for Notator-X), Deluxe Music Construction Set DMCS2*, [https://github.com/timoinutilis/midi-sequencer-amigaos Horny c Src], HD-Rec, [https://aminet.net/package/mus/midi/dominatorV1_51 Dominator],
|<!--AmigaOS4-->[https://sourceforge.net/p/hd-rec/code/HEAD/tree/ HD-Rec Src], Rockbeat, [http://bnp.hansfaust.de/download.html Bars'n'Pipes], [http://os4depot.net/index.php?function=browse&cat=audio/edit Horny], Audio Evolution 4,
|<!--MorphOS-->Bars'n'Pipes,
|-
|<!--Sub Menu-->Sound Sampling
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/record Audio Evolution 4], [http://www.imica.net/SitePortalPage.aspx?siteid=1&did=162 Quick Record], [https://archives.arosworld.org/index.php?function=browse&cat=audio/misc SOX to get AIFF 16bit files], [https://github.com/aros-development-team/AROS/tree/master/workbench/tools/AHIRecord AHIRecord],
|<!--Amiga OS-->[https://aminet.net/package/mus/edit/AudioEvolution3_src Audio Evolution 3 c src], [ Samplitude]*, Audiomaster IV*,
|<!--AmigaOS4-->[https://github.com/timoinutilis/phonolith-amigaos phonolith c src], HD-Rec, Audio Evolution 4,
|<!--MorphOS-->[https://sourceforge.net/p/hd-rec/code/HEAD/tree/ HD-Rec Src], Audio Evolution 4,
|-
|<!--Sub Menu-->Audio Processing like easyeffects so having limiter, compressor, convolver, equalizer and auto volume and many other plugins
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Live Looping or Audio Misc - Groovebox like
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->CD/DVD burn
|[https://code.google.com/p/amiga-fryingpan/ FryingPan],
|<!--Amiga OS-->FryingPan, [http://www.estamos.de/makecd/#CurrentVersion MakeCD],
|<!--AmigaOS4-->FryingPan, AmiDVD,
|[http://www.amiga.org/forums/printthread.php?t=58736 FryingPan], Jalopeano,
|-
|<!--Sub Menu-->CD/DVD audio rip
|Lame, [http://www.imica.net/SitePortalPage.aspx?siteid=1&cfid=0&did=167 Quick CDrip],
|<!--Amiga OS-->Lame,
|<!--AmigaOS4-->Lame,
|Lame,
|-
|<!--Sub Menu-->MP3 v1 and v2 Tagger
|<!--AROS-->id3ren (v1), [http://archives.arosworld.org/index.php?function=browse&cat=audio/edit mp3info],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|
|-
|<!--Sub Menu-->Audio Convert
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/misc Sox], [],
|<!--Amiga OS-->[http://aminet.net/package/mus/misc/SoundBox SoundBox], [http://aminet.net/package/mus/misc/SoundBoxKey SoundBox Key], [http://aminet.net/package/mus/edit/SampleE SampleE], sox
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->DJ mixing jamming
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/djh0ffman/PT1210 Hoffman PT1210 DJ tracker], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Radio Automation Software [http://www.rivendellaudio.org/ Rivendell], [http://code.campware.org/projects/livesupport/report/3 Campware LiveSupport], [http://www.sourcefabric.org/en/airtime/ SourceFabric AirTime], [http://www.ohloh.net/p/mediabox404 MediaBox404],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Speakers Audio Sonos Mains AC networked wired controlled
*2005 ZP100 with ZP80
*2008 Zoneplayer ZP120 (multi-room wireless amp) ZP90 receiver only with CR100 controller,
*2009 ZonePlayer S5,
*2010 BR100 wireless Bridge (no support),
*2011 Play:3
*2013 Bridge (no support), Play:1,
*2016 Arc, Play:1,
*Beam (Gen 2), Playbar, Ray, Era 100, Era 300, Roam, Move 2,
*Sub (Gen 3), Sub Mini, Five, Amp S2
|<!--AROS-->SonosController
|<!--Amiga OS-->SonosController
|<!--AmigaOS4-->SonosController
|<!--MorphOS-->SonosController
|-
|<!--Sub Menu-->Smart Speakers
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Video Creativity and Production==
{| class="wikitable sortable"
|-
!width:30%;|Video
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Playing Video
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/play Mplayer], [ VAMP], [http://www.a500.org/downloads/video/index.xhtml CDXL player], [http://www.a500.org/downloads/video/index.xhtml IffAnimPlay], [],
|<!--Amiga OS-->Frogger*, AMP2, MPlayer, RiVA*, MooViD*,
|<!--AmigaOS4-->DvPlayer, MPlayer
|<!--MorphOS-->MPlayer, Frogger, AMP2, VLC
|-
|<!--Sub Menu-->Streaming Video and game streaming like OBS studio, Parsec, [https://github.com/lizardbyte/sunshine sunshine], [https://github.com/moonlight-stream/moonlight-qt moonlight], etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Playing DVD
|<!--AROS-->[http://a-mc.biz/ AMC]*, Mplayer
|<!--Amiga OS-->AMP2, Frogger
|<!--AmigaOS4-->[http://a-mc.biz/ AMC]*, DvPlayer*, AMP2,
|<!--MorphOS-->Mplayer
|-
|<!--Sub Menu-->Screen Recording
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/record Screenrecorder], [ ], [ ], [ ], [ ],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->Screenrecorder,
|-
|<!--Sub Menu-->Create Edit Individual Video - Amiga like OSs have no pro NLE
|<!--AROS-->[ Mencoder], [ Quick Videos], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit AVIbuild], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/misc FrameBuild], FFMPEG,
|<!--Amiga OS-->[ MainConcept Mainactor Broadcast*], [http://en.wikipedia.org/wiki/Video_Toaster Video Toaster*], MacroSystem MovieShop 4.3*, proDAD Adorage*, [ IOSpirit VHI studio]*, [Gold Disk ShowMaker], [],
|<!--AmigaOS4-->FFMpeg/GUI
|<!--MorphOS-->Blender, Mencoder, FFmpeg
|-
|<!--Sub Menu-->Subtitle editor
|<!--AROS-->[https://aminet.net/package/text/edit/Slarti_Arosx86ABIv0 Slarti_Arosx86ABIv0], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->IP-based video production workflows with High Dynamic Range (HDR), 10-bit color collaborative NDI,
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Blogging like Lemmy or kbin
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR face recognition for Vtubers
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR chatting Live2D models with Cubism type editor or [https://github.com/AyagamiDev/ayagami ayagami] like with zipped moc3 with model metadata (model3, cdi3)
<pre>
Model data (cmo3)
Basic motions (can3)
Background image (png)
Set of files for embedding (runtime folder)
• Model data (moc3)
• Motion data (motion3.json)
• Model settings file (model3.json)
• Physics settings file (physics3.json)
• Display auxiliary file (cdi3.json)
</pre>
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR chatting chatters .VRML models - standardized 3D file format for VR avatars
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->V-tubers V-tubing like Vseeface with Openseeface tracker or Vpuppr (virtual puppet project) for online live 2d / 3d art models rigging rigged LIV
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Misc Application==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1 (68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->File Management
|<!--AROS-->DOpus4, [https://github.com/BlitterStudio/dopus5 DOpus Magellan aka DOpus 5], [ Scalos], [ ],
|<!--Amiga OS-->DOpus2, DOpus 4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], ClassAction, FileMaster, [http://www.amiga.org/forums/showthread.php?t=4897 DirWork 2]*, [https://github.com/RudolphRiedel/DiskMaster2 DiskMaster2 src],
|<!--AmigaOS4-->DOpus4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], Filer, AmiDisk
|<!--MorphOS-->DOpus4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan],
|-
|<!--Sub Menu-->File Verification / Repair
|<!--AROS-->[https://arosarchives.os4depot.net/index.php?function=browse&cat=utility md5sum], [https://arosarchives.os4depot.net/index.php?function=browse&cat=utility/filetool asum], [http://archives.arosworld.org/index.php?function=browse&cat=utility/filetool workpar2] (PAR2), [http://zakalwe.fi/~shd/foss/cksfv/files/ compile cksfv from website],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->Par2,
|-
|Application Installer
|<!--AROS-->[], [ InstallerNG],
|<!--Amiga OS-->InstallerNG, Grunch,
|<!--AmigaOS4-->Jack
|<!--MorphOS-->Jack
|-
|<!--Sub Menu-->Compression archiver [https://github.com/FS-make-simple/paq9a paq9a], [],
|<!--AROS-->XAD system is a toolkit designed for handling various file and disk archiver
|<!--Amiga OS-->
|<!--AmigaOS4-->[https://aminet.net/package/util/pack/decrunchmania_os4 Crunchmania CrM2 depacker],
|<!--MorphOS-->
|-
|<!--Sub Menu-->Binary Hexadecimal Editor
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=development/edit Zaphod], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Repository
|<!--AROS-->[ Git]
|<!--Amiga OS-->
|<!--AmigaOS4-->Git
|<!--MorphOS-->
|-
|<!--Sub Menu-->Filesystem Partition Editor formatter Disk Management
|<!--AROS-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1440&highlight=partition&pid=8821#post_8821 QuickPart], [ HDToolBox]
|<!--Amiga OS-->[https://github.com/stefanskotte/hdpart hdpart], [https://github.com/ChuckyGang/AmiPart AmiPart],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Filesystem Repair and backups
|<!--AROS-->ArSFSDoctor,
|<!--Amiga OS-->[https://aminet.net/package/disk/bakup/quarterback_src Quarterback Tools C and asm src], [ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System Disk check, integrity and history [https://github.com/smartmontools/smartmontools smart tools], [],
|<!--AROS-->
|<!--Amiga OS-->[],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Multiple File renaming
|<!--AROS-->DOpus 4 or 5,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Anti Virus
|<!--AROS-->
|<!--Amiga OS-->VChecker,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Random Wallpaper Desktop changer [ DOpus5], [ Scalos],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Alarm Clock, Timer, Stopwatch, Countdown
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench DClock], [http://aminet.net/util/time/AlarmClockAROS.lha AlarmClock], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Fortune Cookie Quotes Sayings
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/misc AFortune],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->C/C++ IDE
|<!--AROS-->[https://sourceforge.net/projects/aidea/ AIDEa], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit FrexxEd], [https://github.com/vidarh/FrexxEd FrexxEd src], Annotate, Murks,
|<!--Amiga OS-->[http://devplex.awardspace.biz/cubic/index.html Cubic IDE]*, Annotate,
|<!--AmigaOS4-->CodeBench , [https://gitlab.com/boemann/codecraft CodeCraft],
|<!--MorphOS-->[http://devplex.awardspace.biz/cubic/index.html Cubic IDE]*, Anontate,
|-
|<!--Sub Menu-->BASIC Computer Language
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=development/language Basic4SDL], [ Ace Basic], [ X-AMOS], [SDLBasic], [ Alvyn],
|<!--Amiga OS-->[http://www.amiforce.de/main.php Amiblitz 3], [http://amos.condor.serverpro3.com/AmosProManual/contents/c1.html Amos Pro], [http://aminet.net/package/dev/basic/ace24dist ACE Basic],
|<!--AmigaOS4-->
|<!--MorphOS-->sdlBasic
|-
|<!--Sub Menu-->Computer Languages Translation [https://tetracorp.github.io/guide/reverse-engineering-amiga.html], [https://amigasourcecodepreservation.gitlab.io/amiga-assembler-insider-guide/], [https://github.com/kermitfrog/Amiga-Re-Engineering Rust, Ghidra and FS-UAE],
|<!--AROS-->
|<!--Amiga OS-->[https://bitbucket.org/rhinoid/convert68000toc/src/main/ convert m68k seka asm-one to c],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Gui Creators
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=development/guitool MuiBuilder],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[ MuiBuilder],
|-
|<!--Sub Menu-->Catalog .cd .ct Custom App Language Editors
|<!--AROS-->FlexCat, [https://archives.arosworld.org/index.php?function=browse&cat=utility Flexcat GUI], [],
|<!--Amiga OS-->[http://www.geit.de/deu_simplecat.html SimpleCat], FlexCat
|<!--AmigaOS4-->[http://aminet.net/package/dev/misc/simplecat SimpleCat], FlexCat
|<!--MorphOS-->[http://www.geit.de/deu_simplecat.html SimpleCat], FlexCat
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Misc Application 2==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->System
|<!--AROS-->[ SysExplorer], [ SysMon], [ Scout], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Terminals Shells CLIs
|<!--AROS-->[https://tomaszstaniak.com/aros-term/ aros-term], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->OSK On Screen Keyboard
|<!--AROS-->[],
|<!--Amiga OS-->[https://aminet.net/util/wb/OSK.lha OSK]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen Magnifier Magnifying Glass Magnification
|<!--AROS-->[http://www.onyxsoft.se/files/zoomit.lha ZoomIT],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Comic Book CBR CBZ format reader viewer
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer comics], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer comicon], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Ebook Reader
|<!--AROS-->[https://blog.alb42.de/programs/#legadon Legadon EPUB],[]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Ebook Converter
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Text to Speech tts [https://github.com/JonathanFly/bark-installer Bark], [],
|<!--AROS-->[ Echo " " >SPEAK:A1 inbuilt], [http://archives.arosworld.org/index.php?function=browse&cat=audio/misc flite],
|<!--Amiga OS-->[http://www.text2speech.com translator],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=search&tool=simple FLite]
|<!--MorphOS-->[http://se.aminet.net/pub/aminet/mus/misc/ FLite]
|-
|<!--Sub Menu-->Speech Voice Recognition Dictation - [http://sourceforge.net/projects/cmusphinx/files/ CMU Sphinx], [http://julius.sourceforge.jp/en_index.php?q=en/index.html Julius], [http://www.isip.piconepress.com/projects/speech/index.html ISIP],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Speech Voice Changer [], [], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen Display Blanker screensaver
|<!--AROS-->Blanker Commodity (built in), [https://archives.arosworld.org/index.php?function=browse&cat=graphics/screenblanker GarshneBlanker], [http://sourceforge.net/projects/gblanker/ GBlanker Src], [],
|<!--Amiga OS-->MultiCX,
|<!--AmigaOS4-->
|<!--MorphOS-->ModernArt Blanker,
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
==Misc Application 3==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Fractals mandelbrot, etc
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=graphics/misc],
|<!--Amiga OS-->ZoneXplorer,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Landscape Rendering
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=graphics/raytrace WCS World Construction Set],
|<!--Amiga OS-->[ Vista Pro], [http://en.wikipedia.org/wiki/World_Construction_Set World Construction Set]
|<!--AmigaOS4-->[ WCS World Construction Set],
|<!--MorphOS-->[ WCS World Construction Set],
|-
|<!--Sub Menu-->Astronomy [https://sourceforge.net/projects/skychart/ skychart freepascal], [], [],
|<!--AROS-->[ Digital Almanac (ABIv0 only)],
|<!--Amiga OS-->[http://aminet.net/search?query=planetarium Aminet search], [http://aminet.net/misc/sci/DA3V56ISO.zip Digital Almanac], [https://aminet.net/package/misc/sci/da3sourceV58 Src c V58], [ Galileo renamed to Distant Suns]*, [],
|<!--AmigaOS4-->[http://sourceforge.net/projects/digital-almanac/ Digital Almanac], Distant Suns*, [http://www.digitaluniverse.org.uk/ Digital Universe]*,
|<!--MorphOS-->[http://www.aminet.net/misc/sci/da3.lha Digital Almanac], [http://www.aminet.net/package/misc/sci/da3-mos-src Src c V56],
|-
|<!--Sub Menu-->Astrology [https://sourceforge.net/projects/skylendar/ skylendar], [https://github.com/CruiserOne/Astrolog Astrolog], [https://www.astrolog.org/astrolog/astfile.htm Astrology alt site], [https://saravali.github.io/download.html Maitreya], [https://github.com/alamahant/Asteria Asteria],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Genealogy History Family Tree Ancestry Records (FreeBMD, FreeREG, and FreeCEN file formats or GEDCOM GenTree)
|<!--AROS-->
|<!--Amiga OS--> [ Origins], [ Your Family Tree], [ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Languages
|<!--AROS-->
|<!--Amiga OS-->Fun School,
|<!--AmigaOS4-->
|<!--MorphOS-->https://github.com/evil4dmin/ami2ha
|-
|<!--Sub Menu-->Mathematics ([http://www-fourier.ujf-grenoble.fr/~parisse/install_en.html Xcas], etc.),
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/scientific mathX]
|<!--Amiga OS-->Maple V, mathX, Fun School, GCSE Maths, [ ], [ ], [ ],
|<!--AmigaOS4-->Yacas
|<!--MorphOS-->Yacas
|-
|<!--Sub Menu-->Maths Graph Function Plotting
|<!--AROS-->[https://blog.alb42.de/programs/#MUIPlot MUIPlot],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->App Utility Launcher Dock toolbar
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/docky BoingBar], [],
|<!--Amiga OS-->[https://github.com/adkennan/DockBot Dockbot],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Printer [https://github.com/OrcaSlicer/OrcaSlicer OrcaSlicer]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->PCB design
|<!--AROS-->
|<!--Amiga OS-->[ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Digital Signage
|<!--AROS-->Hollywood, Hollywood Designer
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->HAM radio, amateur radio, packet radio, [], [], [], [https://cemaxecuter.com/ Dragon OS], [https://github.com/km4ack/73Linux with 73 link update], [https://www.youtube.com/watch?v=YAL5KNePRSg video for],
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/punktniklas/NiKom NiKom], [https://www.amigarealm.com/amiga/amicomms/comm4.htm Comm4], [https://www.amigarealm.com/archives/comms/aarug/ TNC Terminal Node Controller with packets over serial connections on Yaesu or Woxum handheld], [https://aminet.net/comm/misc AmiCom], [ with 7Plus file encoder/decoder], [ mksstv], [ RTTYam],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Home Assistant
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/evil4dmin/ami2ha HA]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Games & Emulation==
Some emulators/games require OpenGL to function and to adjust ahi prefs channels, frequency and unit0 and unit1 and
[http://aros.sourceforge.net/documentation/users/shell/changetaskpri.php changetaskpri -1]
Rom patching https://www.marcrobledo.com/RomPatcher.js/ https://www.romhacking.net/patch/ (ips, ups, bps, etc) and this other site supports the latter formats https://hack64.net/tools/patcher.php
Free public domain roms for use with emulators can be found [http://www.pdroms.de/ here] as most of the rest are covered by copyright rules. If you like to read about old games see [http://retrogamingtimes.com/ here] and [http://www.armchairarcade.com/neo/ here] and a [http://www.vintagecomputing.com/ blog] about old computers. Possibly some of the [http://www.answers.com/topic/list-of-best-selling-computer-and-video-games best selling] of all time. [http://en.wikipedia.org/wiki/List_of_computer_system_emulators Wiki] with emulated systems list.
[https://archive.gamehistory.org/ Archive of VGHF], [https://library.gamehistory.org/ Video Game History Foundation Library search]
{| class="wikitable sortable"
|-
!width:10%;|Games [http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Emulation]
!width:10%;|AROS(x86)
!width:10%;|AmigaOS3(68k)
!width:10%;|AmigaOS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Games Emulation Amstrad CPC
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [ Caprice32 (OpenGL & pure SDL)], [ Arnold], [https://retroshowcase.gr/cpcbox-master/],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://os4depot.net/index.php?function=browse&cat=emulation/computer]
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2],
|-
|<!--Sub Menu-->Games Emulation Apple2 and 2GS
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Arcade
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Mame], [ SI Emu (ABIv0 only)],
|<!--Amiga OS-->Mame,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem xmame], amiarcadia,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2 Mame],
|-
|<!--Sub Menu-->Games Emulation Atari 2600 [], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Stella],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 5200 [https://github.com/wavemotion-dave/A5200DS A5200DS], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 7800
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 400 800 130XL [https://github.com/wavemotion-dave/A8DS A8DS], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Atari800],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari Lynx
|<!--AROS-->[http://myfreefilehosting.com/f/6366e11bdf_1.93MB Handy (ABIv0 only)],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari Jaguar
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Bandai Wonderswan
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation BBC Micro and Acorn Electron [http://beehttps://bem-unix.bbcmicro.com/download.html BeebEm], [http://b-em.bbcmicro.com/ B-Em], [http://elkulator.acornelectron.co.uk/ Elkulator], [http://electrem.emuunlim.com/ ElectrEm],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Dragon 32 and Tandy CoCo [http://www.6809.org.uk/xroar/ xroar], [],
|<!--AROS-->[], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Commodore C16 Plus4
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Commodore C64
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Vice (ABIv0 only)], [],
|<!--Amiga OS-->Frodo,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem viceplus],
|<!--MorphOS-->Vice,
|-
|<!--Sub Menu-->Games Emulation Commodore Amiga
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Janus UAE], Emumiga,
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://os4depot.net/index.php?function=browse&cat=emulation/computer UAE],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2 UAE],
|-
|<!--Sub Menu-->Games Emulation Japanese MSX MSX2
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Mattel Intelivision
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Mattel Colecovision and Adam
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Milton Bradley (MB) Vectrex [ Vectrex OpenGL],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation PICO8 Pico-8 fantasy video game console [https://github.com/egordorichev/pemsa-sdl/ pemsa-sdl], [https://github.com/jtothebell/fake-08 fake-08], [https://github.com/Epicpkmn11/fake-08/tree/wip fake-08 fork],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo Gameboy
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem vba no sound], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem vba]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo NES
|<!--AROS-->[ EmiNES], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Fceu], [https://github.com/takahirox/nes-js?tab=readme-ov-file nes-js], [https://github.com/bfirsh/jsnes jsnes], [https://github.com/angelo-wf/NesJs NesJs],
|<!--Amiga OS-->AmiNES, [http://www.dridus.com/~nyef/darcnes/ darcNES],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem amines]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo SNES
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Zsnes],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem warpsnes]
|<!--MorphOS-->[http://fabportnawak.free.fr/snes/ Snes9x],
|-
|<!--Sub Menu-->Games Emulation Nintendo N64
*HLE and plugins [ mupen64], [https://github.com/ares-emulator/ares ares], [https://github.com/N64Recomp/N64Recomp N64Recomp], [https://github.com/rt64/rt64 rt64], [https://github.com/simple64/simple64 Simple64],
*LLE [],
|<!--AROS-->[http://code.google.com/p/mupen64plus/ Mupen64+],
|<!--Amiga OS-->[http://code.google.com/p/mupen64plus/ Mupen64+], [http://aminet.net/package/misc/emu/tr-981125_src TR64],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Nintendo Gamecube Wii]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Nintendo Wii U]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://github.com/yuzu-emu Nintendo Switch]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation NEC PC Engine
|<!--AROS-->[], [], [https://github.com/yhzmr442/jspce js-pce],
|[http://www.hugo.fr.fm/ Hugo], [http://mednafen.sourceforge.net/ Mednafen],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem tgemu]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Master System (SMS)
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Dega], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem sms],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem osmose]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Genesis/Megadrive
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem gp no sound], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem DGen],
|<!--Amiga OS-->[http://code.google.com/p/genplus-gx/ Genplus],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem genesisplus]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Saturn
*HLE [https://mednafen.github.io/ mednafen], [http://yabause.org/ yabause], [],
*LLE [], [],
|<!--AROS-->?
|<!--Amiga OS-->[http://yabause.org/ Yabause],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Dreamcast
*HLE [https://github.com/flyinghead/flycast flycast], [https://code.google.com/archive/p/nulldc/downloads NullDC],
*LLE [], [],
|<!--AROS-->?
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair ZX80 and ZX81
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair Spectrum
|[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Fuse (crackly sound)], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer SimCoupe], [ FBZX slow], [https://jsspeccy.zxdemo.org/ jsspeccy], [http://torinak.com/qaop/games qaop],
|<!--Amiga OS-->[http://www.lasernet.plus.com/ Asp], [http://www.zophar.net/sinclair.html Speculator], [http://www.worldofspectrum.org/x128/index.html X128],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/computer]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair QL
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [],
|<!--Amiga OS-->[http://aminet.net/package/misc/emu/QDOS4amiga1 QDOS4amiga]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation SNK NeoGeo Pocket
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem gngeo], NeoPop,
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sony PlayStation
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem FPSE],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem FPSE]
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Sony PS2]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Sony PS3]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://vita3k.org/ Sony Vita]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://github.com/shadps4-emu/shadPS4 PS4]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation [http://en.wikipedia.org/wiki/Tangerine_Computer_Systems Tangerine] Oric and Atmos
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Oricutron]
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem Oricutron]
|<!--MorphOS-->[http://aminet.net/package/misc/emu/oricutron Oricutron]
|-
|<!--Sub Menu-->Games Emulation TI 99/4 99/4A [https://github.com/wavemotion-dave/DS994a DS994a], [], [https://js99er.net/#/ js99er], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer],
|<!--Amiga OS-->[http://aminet.net/package/misc/emu/TI4Amiga TI4Amiga], [http://aminet.net/package/misc/emu/TI4Amiga_src TI4Amiga src in c],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation HP 38G 40GS 48 49G/50G Graphing Calculators
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation TI 58 83 84 85 86 - 89 92 Graphing Calculators
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
{| class="wikitable sortable"
|-
!width:10%;|Games [https://www.rockpapershotgun.com/ General]
!width:10%;|AROS(x86)
!width:10%;|AmigaOS3(68k)
!width:10%;|AmigaOS4(PPC)
!width:10%;|MorphOS(PPC)
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Games [https://www.trackawesomelist.com/michelpereira/awesome-open-source-games/ Open Source and others] || AROS || Amiga OS || Amiga OS4 || Morphos
|-
|<!--Sub Menu-->Games Action like [https://github.com/opentomb/OpenTomb opentomb], [https://github.com/LostArtefacts/TRX TRX formerly Tomb1Main], [https://github.com/TombEngine TombEngine], [http://archives.arosworld.org/index.php?function=browse&cat=game/action Thrust], [https://github.com/fragglet/sdl-sopwith sdl sopwith],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/action], [https://archives.arosworld.org/index.php?function=browse&cat=game/action BOH], [],
|<!--Amiga OS-->[https://github.com/BSzili/OpenLara/tree/amiga/src source of openlara SDL2],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Adventure like [http://dotg.sourceforge.net/ DMJ], [https://github.com/kromenak/gengine Gabriel Knight 3], [http://www.sarien.net/ Sierra Sarien], [https://github.com/klembot/twinejs twine js], [https://github.com/QSPFoundation/qspgui Quest Soft Player QSP], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/adventure dmagnetic], [https://archives.arosworld.org/?function=browse&cat=emulation/misc ScummVM], [https://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying frotz infocom], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Board like [https://github.com/aperture-software/colditz-escape escape from colditz], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/board], [http://amigan.1emu.net/releases Africa]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Cards
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/card], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=180&pid=12934#post_12934 Balatro],
|<!--AmigaOS-->[http://home.arcor.de/amigasolitaire/e/welcome.html Reko], [https://github.com/samskivert/beschei-en beschei Src],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Misc [https://github.com/michelpereira/awesome-open-source-games Awesome open], [https://github.com/bobeff/open-source-games General Open Source], [https://github.com/SAT-R/sa2 Sonic Advance 2], [https://github.com/velorek1/cwordle Wordle type],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/misc], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games FPS like [https://aminet.net/package/game/shoot/D1X_Rebirth_AGA Descent D1X src], [https://github.com/DescentDevelopers/Descent3 Descent 3], [https://github.com/Fewnity/Counter-Strike-Nintendo-DS Counter-Strike-Nintendo-DS], [https://github.com/Aleph-One-Marathon/alephone Bungie Marathon 1994], [https://zdoom.org/downloads UzDoom opengl 3.3], [https://github.com/ZDoom/gzdoom gzdoom opengl 3+], [https://zdoom.org/downloads LZDoom opengl 2.1],
|<!--AROS-->Doom, Quake, [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Quake 3 Arena (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Cube (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Assault Cube (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Cube 2 Sauerbraten (OpenGL)], [http://fodquake.net/test/ FodQuake QuakeWorld], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Duke Nukem 3D], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Darkplaces Nexuiz Xonotic], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Doom 3 SDL (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Hexenworld and Hexen 2], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Aliens vs Predator Gold 2000 avp (openGL)], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Odamex (openGL doom)], [https://archives.arosworld.org/?function=showfile&file=game/fps/ zgloom], [], [https://archives.arosworld.org/?function=showfile&file=game/fps/ ab3dhd], [],
|<!--Amiga OS-->Doom, Quake, AB3D, Fears, Breathless, Gloom,
|<!--AmigaOS4-->Doom, Quake,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12 Doom], Quake, Quake 3 Arena, [https://github.com/OpenXRay/xray-16 S.T.A.L.K.E.R Xray]
|-
|<!--Sub Menu-->Games MMORG like
|<!--AROS-->[ Eternal Lands (OpenGL)],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Platform like
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/platform], [ Maze of Galious], [ Gish]*(openGL), [ Mega Mario], [https://archives.arosworld.org/?function=showfile&file=game/platform/ thextech SMBX], [http://www.gianas-return.de/ Giana's Return], [http://www.sqrxz.de/ Sqrxz], [www.sqrxz2.de/ Sqrxz 2], [http://www.sqrxz.de/sqrxz-3/ Sqrxz 3], [http://www.sqrxz.de/sqrxz-4/ Sqrxz 4], [http://archives.arosworld.org/index.php?function=browse&cat=game/platform Cave Story], [https://bszili.morphos.me/ Frogatto], [https://bszili.morphos.me/ OpenJazz], [https://archives.arosworld.org/?function=showfile&file=game/platform/ pekkakana2], [ Aquaria], [https://archives.arosworld.org/?function=showfile&file=game/platform/ sonic CD], [],
|<!--Amiga OS-->[ Giana Sisters], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Puzzle [https://github.com/mariopartyrd/marioparty4/tree/port Party], [https://github.com/mdodis/OpenSolomonsKey OpenSolomonsKey], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/puzzle], [ Cubosphere (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/puzzle Candy Crisis], [http://bszili.morphos.me/ TailTale],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Racing [ Trigger Rally], [ VDrift], [http://www.ultimatestunts.nl/index.php?page=2&lang=en Ultimate Stunts], [http://maniadrive.raydium.org/ Mania Drive], [https://github.com/plowteam/donut Simpsons Hit and Run], [],
|<!--AROS-->[ Super Tux Kart (OpenGL)], [http://www.dusabledanslherbe.eu/AROSPage/F1Spirit.30.html F1 Spirit (OpenGL)], [http://bszili.morphos.me/index.html MultiRacer], [https://bszili.morphos.me/ Speed Dreams], [https://archives.arosworld.org/?function=showfile&file=game/driving/dethrace-0.10.1.x86_64-aros-v11.zip Carmageddon dethrace 64bit], [],
|<!--AmigaOS-->
|<!--AmigaOS4-->[http://bszili.morphos.me/index.html Speed Dreams],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12], [http://bszili.morphos.me/index.html TORCS],
|-
|<!--Sub Menu-->Games 1st first person DRPG [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/OpenEnroth/OpenEnroth OpenEnroth MM], []
|<!--AROS-->[https://github.com/BSzili/aros-stuff Arx Libertatis], [http://www.playfuljs.com/a-first-person-engine-in-265-lines/ js raycaster], [https://github.com/Dorthu/es6-crpg webgl], [https://github.com/sonountaleban/AmiShockolate System Shock], [], [],
|<!--AmigaOS-->Phantasie, Faery Tale, Dungeon Master,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games 3rd third person action CRPG [https://sourceforge.net/projects/sumwars/ Summoning Wars], [https://www.solarus-games.org/ Solarus], [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/alexbatalov/fallout1-ce fallout ce], [https://github.com/rwengine/openrw gta3], [https://github.com/gta-reversed/gta-reversed gta3 sa], [https://github.com/mrxenginner/reVC gta3 vc revc],
|<!--AROS-->[https://archives.arosworld.org/?function=showfile&file=game/strategy/ fheroes2 homm2], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ breakhack], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ devilutionx diablo 1 hellfire], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ fallout 1], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ stratagus], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ hostile-takeover], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games isometric RPG [https://sourceforge.net/projects/sumwars/ Summoning Wars], [https://www.solarus-games.org/ Solarus], [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/topics/dungeon?l=javascript Dungeon], [], [https://github.com/clintbellanger/heroine-dusk JS Dusk],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying nethack], [https://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying GemRB], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games card based RPG [https://github.com/open-duelyst/duelyst Duelyst], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games turn based tactics RPG [], [], [], [], [], [],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/strategy UFO AI], [http://play.freeciv.org/ FreeCiv], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Strategy [http://rtsgus.org/ RTSgus], [http://stargus.sourceforge.net/ Stargus], [https://github.com/KD-lab-Open-Source/Perimeter Perimeter], [https://matty77.itch.io/conflict-3049 conflict-3049], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/strategy MegaGlest (OpenGL)], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ signus], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=140&pid=12446#post_12446 Wargus warcraft 2 setup],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12]
|-
|<!--Sub Menu-->Games Rhythm, Beat, Step [], [], [https://clonehero.net/ clonehero], [https://github.com/MatteoGodzilla/Dj-Engine Dj-Engine],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/misc Frets on Fire], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Shoot Em Ups [http://www.mhgames.org/oldies/formido/ Formido], [http://code.google.com/p/violetland/ Violetland],
||<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/action Open Tyrian], [http://www.parallelrealities.co.uk/projects/starfighter.php Starfighter], [ Alien Blaster], [https://github.com/OpenFodder/openfodder OpenFodder], [https://archives.arosworld.org/?function=showfile&file=game/action/ tbftss The Battle for the Solar System: the Pandora War]
|<!--AmigaOS-->
|<!--AmigaOS4-->[http://www.parallelrealities.co.uk/projects/starfighter.php Starfighter], [ The Battle for the Solar System: the Pandora War]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Simulations [http://scp.indiegames.us/ Freespace 2], [http://www.heptargon.de/gl-117/gl-117.html GL117], [http://code.google.com/p/corsix-th/ Theme Hospital], [http://code.google.com/p/freerct/ Rollercoaster Tycoon], [http://hedgewars.org/ Hedgewars], [https://github.com/raceintospace/raceintospace raceintospace], [https://github.com/Return-To-The-Roots RTTR Settlers 2], [https://github.com/OoliteProject/oolite oolite elite], [https://github.com/fesh0r/newkind newkind elite], [https://github.com/bohemiainteractive/cwr Arma Cold War Src], [], [],
|<!--AROS-->
|<!--Amiga OS-->SimCity, SimAnt, Sim Hospital, Theme Park, [https://github.com/angree/openttd_amiga_68k openttd amiga_68k],
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12]
|-
|<!--Sub Menu-->Games Life Sim [https://github.com/ACreTeam/forest Animal Crossing], [ ], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Horror [https://github.com/Mikompilation/MikuPan Fatal Frame], [ ], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Sandbox Voxel Open World Exploration [https://github.com/ClassiCube/ Classicube],[http://www.michaelfogleman.com/craft/ Craft], [https://github.com/tothpaul/DelphiCraft DelphiCraft],[https://www.minetest.net/ Luanti formerly Minetest], [ infiniminer],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Battle Royale [https://bruh.io/ Play.Bruh.io], [https://www.coolmathgames.com/0-copter Copter Royale], [https://surviv.io/ Surviv.io], [https://nuggetroyale.io/#Ketchup Nugget Royale], [https://miniroyale2.io/ Miniroyale2.io],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Tower Defense [https://chriscourses.github.io/tower-defense/ HTML5], [https://github.com/SBardak/Tower-Defense-Game TD C++], [https://github.com/bdoms/love_defense LUA and LOVE], [https://github.com/HyOsori/Osori-WebGame HTML5], [https://github.com/PascalCorpsman/ConfigTD ConfigTD Pascal], [https://github.com/GloriousEggroll/wine-ge-custom Wine], []
|<!--AROS-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=180&pid=12871#post_12871 Plants vs Zombies PvZ],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Visual Novel Engines [https://github.com/diane1f0cd/VisualNovelTemplate Visual Novel Template], [https://github.com/Kirilllive/tuesday-js Tuesday JS], [https://github.com/tejasnayak25/vnsutra vnsutra], [https://github.com/weetabix-su/renpsp-dev RenPSP], [https://github.com/Galladite27/ONScripter-EN ONScripter-EN], [https://github.com/NathanGuilhot/VNES-Raylib https://github.com/NathanGuilhot/VNES VNES in Raylib], [https://www.renpy.org/latest.html renpy ren'py python based],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Reality VR [https://gitlab.com/madsbuvi/openmw openmw vr], [https://github.com/Team-Beef-Studios/BeefRaiderXR BeefRaiderXR],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Table Top VTT [ Roll20], [https://www.owlbear.rodeo/ owlbear rodeo], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Computer assisted TableTop TTRPG OSR [https://www.rpgsolo.com/play.php RPGSolo], [https://github.com/fpsvogel/solo-ttrpgs Solo TTRPG], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games 2D 3D Engines [https://github.com/fegennari/3DWorld 3DWorld], [https://github.com/GarageGames/Torque3D Torque3D], [https://github.com/gameplay3d/GamePlay GamePlay 3D], [https://www.babylonjs.com/ BabylonJS ], [ Godot], [ Ogre], [ Crystal Space], [https://github.com/JacobHess03/ Dragon-Quest like], [https://github.com/bjornbytes/lovr Lua LOVE for 2D LOVR for 3D], [],
|<!--AROS-->[https://www.arkhamdev.net/wiki.htm?id=agx Arkham Development antiryadgx 8.9 lts with register], [],
|<!--Amiga OS-->[https://github.com/alpyre/Sevgi_Engine Sevgi Engine], [], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games C based game frameworks [https://github.com/orangeduck/Corange Corange], [https://github.com/scottcgi/Mojoc Mojoc], [https://orx-project.org/ Orx], [https://github.com/ioquake/ioq3 Quake 3], [https://www.mapeditor.org/ Tiled], [https://www.raylib.com/ 2d Raylib], [https://github.com/Rabios/awesome-raylib other raylib], [https://github.com/MrFrenik/gunslinger Gunslinger], [https://o3de.org/ o3d], [http://archives.aros-exec.org/index.php?function=browse&cat=development/library GLFW], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=development/library Raylib 5],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games RPGMaker MV/MZ-compatible projects [https://github.com/Psychronic-Games/RPGReactor RPGReactor js],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Pinball [https://github.com/vpinball/vpinball vpinball], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games unpack unarc [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
==Application Guides==
[[#top|...to the top]]
===Web Browser===
OWB is now at version 2.0 (which got an engine refresh, from July 2015 to February 2019) and 3.0.
This latest version has a good support for many/most web sites, even YouTube web page now works. [https://www.bilibili.tv/en/search untested]
This improved compatibility comes at the expense of higher RAM usage (now 1GB RAM is the absolute minimum).
Also, keep in mind that the lack of a JIT (Just-In-Time) JS compiler on the 32 bit version, makes the web surfing a bit slow.
Only the 64 bit version of OWB 2.0 will have JIT enabled, thus benefitting of more speed. There are tooltypes that can be added to the icon to provide further features JIT, MSE etc
Certificates from [https://curl.se/docs/caextract.html ca certs],
DNS tracking blocking with [https://easylist.to/easylist/easylist.txt easylist.txt] in PROGDIR:Conf before starting browser with enabled AdBlock [https://github.com/easylist/easylist/tree/master easylist], [https://gitlab.com/eyeo anti abp], [https://firebog.net/ big blocklist], [https://github.com/StevenBlack/hosts Steves], [], [],
This can be enabled with OWB Odyssey with Windows -> Content Blocking and Windows -> Messages and enter
https://www.youtube.com/api/stats/ads*
https://www.youtube.com/pagead/adview*
https://www.youtube.com#@##player-ads*
into your custom filters
Element blocker browser extension might be needed for [https://github.com/easylist/easylist/wiki/Youtube-Issues youtube], [ mid roll], [ pre roll], [ ],
OWB speed is much better when running from RAM Disk, the best way is to add the below into your S:User-Startup which copies OWB drawer from Extras:Internet/OWB to RAM Disk:
So add this :
<pre>
copy Extras:Internet/OWB Ram:OWB/ ALL CLONE >NIL:
copy Extras:Internet/OWB.info Ram: >NIL:
</pre>
Open RAM Disk and open OWB drawer and double click on OWB icon so that the above icon tooltypes are activated
Problems are that the copy time is long (around 20 seconds added in the background), but we can make it faster if we delete useless files from the OWB drawer (docs, …)
If you don’t copy the drawer back onto the HD, you won’t save your cache, cookies, passwords… So you need a script for it.
Error messages
SSL error "cant verify with ca-certificates", check bios clock time date is correct
Error 6, try checking networking prefs settings and Save / Use preferences again or a '''few times''' otherwise the network chipset may not be compatible with Aros
[https://www.google.com/search?q=%s&udm=14 Google search without AI overview]
===E-mail===
YAM does not support SSL and most mail providers now switched to encrypted SMTP/POP3 connections
====SimpleMail====
SimpleMail supports IMAP and appears to work with GMail, but it's never been reliable enough, it can crash with large mailboxes.
Please read more on this [http://www.freelists.org/list/simplemail-usr User list]
GMail
Be sure to activate the pop3 usage in your gmail account setup / configuration first.
pop3:
pop.gmail.com
Use SSL: Yes
Port: 995
smtp:
smtp.gmail.com (with authentication)
Use Authentication: Yes
Use SSL: Yes
Port: 465 or 587
Hotmail/MSN/outlook/Microsoft Mail mid-2017, all outlook.com accounts will be migrated to Office 365 / Exchange
Most users are currently on POP which does not allow showing folders and many other features (technical limitations of POP3). With Microsoft IMAP you will get folders, sync read/unread, and show flags. You still won't get push though, as Microsoft has not turned on the IMAP Idle command as at Sept 2013.
If you want to try it, you need to first remove (you can't edit) your pop account (long-press the account on the accounts screen, delete account). Then set it up this way:
1. Email/Password
2. Manual
3. IMAP
4.
* Incoming: imap-mail.outlook.com, port 993, SSL/TLS should be checked
* Outgoing: smtp-mail.outlook.com, port 587, SSL/TLS should be checked
* POP server name pop-mail.outlook.com, port 995, POP encryption method SSL
Yahoo Mail
On April 24, 2002 Yahoo ceased to offer POP access to its free mail service. Introducing instead a yearly payment feature, allowing users POP3 and IMAP server support, along with such benefits as larger file attachment sizes and no adverts.
Sorry to see Yahoo leaving its users to cough up for the privilege of accessing their mail. Understandable, when competing against rivals such as Gmail and Hotmail who hold a large majority of users and were hacked in 2014 as well.
Incoming Mail (IMAP) Server
* Server - imap.mail.yahoo.com
* Port - 993
* Requires SSL - Yes
Outgoing Mail (SMTP) Server
* Server - smtp.mail.yahoo.com
* Port - 465 or 587
* Requires SSL - Yes
* Requires authentication - Yes
Your login info
* Email address - Your full email address (name@domain.com)
* Password - Your account's password
* Requires authentication - Yes
Note that you need to enable “Web & POP Access” in your Yahoo Mail account to send and receive Yahoo Mail messages through any other email program.
You will have to enable “Allow your Yahoo Mail to be POPed” under “POP and Forwarding”, to send and receive Yahoo mails through any other email client.
Cannot be done since 2002 unless the customer pays Yahoo a subscription subs fee to have access to SMTP and POP3
* Set the POP server for incoming mails as pop.mail.yahoo.com. You will have to enable “SSL” and use 995 for Port.
* “Account Name or Login Name” – Your Yahoo Mail ID i.e. your email address without the domain “@yahoo.com”.
* “Email Address” – Your Yahoo Mail address i.e. your email address including the domain “@yahoo.com”. E.g. myname@yahoo.com
* “Password” – Your Yahoo Mail password.
Yahoo! Mail Plus users may have to set POP server as plus.pop.mail.yahoo.com and SMTP server as plus.smtp.mail.yahoo.com.
* Set the SMTP server for outgoing mails as smtp.mail.yahoo.com. You will also have to make sure that “SSL” is enabled and use 465 for port. you must also enable “authentication” for this to work.
====YAM Yet Another Mailer====
YAM does not support SSL and most mail providers have now switched to encrypted SMTP/POP3 connections
This email client is POP3 only if the SSL library is available [http://www.freelists.org/list/yam YAM Freelists]
One of the downsides of using a POP3 mailer unfortunately - you have to set an option not to delete the mail if you want it left on the server. IMAP keeps all the emails on the server.
Possible issues
Sending mail issues is probably a matter of using your ISP's SMTP server, though it could also be an SSL issue.
getting a "Couldn't initialise TLSv1 / SSL error
Use of on-line e-mail accounts with this email client is not possible as it lacks the OpenSSL AmiSSl v3 compatible library
GMail
Incoming Mail (POP3) Server - requires SSL: pop.gmail.com
Use SSL: Yes
Port: 995
Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes
Use STARTTLS: Yes (some clients call this SSL)
Port: 465 or 587
Account Name: your Gmail username (including '@gmail.com')
Email Address: your full Gmail email address (username@gmail.com)
Password: your Gmail password
Anyway, the SMTP is pop.gmail.com port 465 and it uses SSLLv3 Authentication. The POP3 settings are for the same server (pop.gmail.com), only on port 995 instead.
Outlook.com access
<pre >
Outlook.com SMTP server address: smtp.live.com
Outlook.com SMTP user name: Your full Outlook.com email address (not an alias)
Outlook.com SMTP password: Your Outlook.com password
Outlook.com SMTP port: 587
Outlook.com SMTP TLS/SSL encryption required: yes
</pre >
Yahoo Mail
<pre >
“POP3 Server” – Set the POP server for incoming mails as pop.mail.yahoo.com. You will have to enable “SSL” and use 995 for Port.
“SMTP Server” – Set the SMTP server for outgoing mails as smtp.mail.yahoo.com. You will also have to make sure that “SSL” is enabled and use 465 for port. you must also enable “authentication” for this to work.
“Account Name or Login Name” – Your Yahoo Mail ID i.e. your email address without the domain “@yahoo.com”.
“Email Address” – Your Yahoo Mail address i.e. your email address including the domain “@yahoo.com”. E.g. myname@yahoo.com
“Password” – Your Yahoo Mail password.
</pre >
Yahoo! Mail Plus users may have to set POP server as plus.pop.mail.yahoo.com and SMTP server as plus.smtp.mail.yahoo.com.
Note that you need to enable “Web & POP Access” in your Yahoo Mail account to send and receive Yahoo Mail messages through any other email program.
You will have to enable “Allow your Yahoo Mail to be POPed” under “POP and Forwarding”, to send and receive Yahoo mails through any other email client.
Cannot be done since 2002 unless the customer pays Yahoo a monthly fee to have access to SMTP and POP3
Microsoft Outlook Express Mail
1. Get the files to your PC.
By whatever method get the files off your Amiga onto your PC. In the YAM folder you have a number of different folders, one for each of your folders in YAM. Inside that is a file usually some numbers such as 332423.283. YAM created a new file for every single email you received.
2. Open up a brand new Outlook Express. Just configure the account to use 127.0.0.1 as mail servers. It doesn't really matter. You will need to manually create any subfolders you used in YAM.
3. You will need to do a mass rename on all your email files from YAM. Just add a .eml to the end of it. Amazing how PCs still rely mostly on the file name so it knows what sort of file it is rather than just looking at it! There are a number of multiple renamers online to download and free too.
4. Go into each of your folders, inbox, sent items etc. And do a select all then drag the files into Outlook Express (to the relevant folder obviously) Amazingly the file format that YAM used is very compatible with .eml standard and viola your emails appear. With correct dates and working attachments.
5. If you want your email into Microsoft Outlook. Open that up and create a new profile and a new blank PST file. Then go into File Import and choose to import from Outlook Express. And the mail will go into there. And viola.. you have your old email from your Amiga in a more modern day format.
===FTP===
Magellan has a great FTP module. It allows transferring files from/to a FTP server over the Internet or the local network and, even if FTP is perceived as a "thing of the past", its usability is all inside the client. The FTP thing has a nice side effect too, since every Icaros machine can be a FTP server as well, and our files can be easily transferred from an Icaros machine to another with a little configuration effort.
First of all, we need to know the 'server' IP address. Server is the Icaros machine with the file we are about to download on another Icaros machine, that we're going to call 'client'. To do that, move on the server machine and 1) run Prefs/Services to be sure "FTP file transfer" is enabled (if not, enable it and restart Icaros); 2) run a shell and enter this command:
ifconfig -a
Make a note of the IP address for the network interface used by the local area network. For cabled devices, it usually is net0:. Now go on the client machine and run Magellan:
Perform these actions: 1) click on FTP; 2) click on ADDRESS BOOK; 3) click on "New".
You can now add a new entry for your Icaros server machine:
1) Choose a name for your server, in order to spot it immediately in the address book. Enter the IP address you got before.
2) click on Custom Options:
1) go to Miscellaneous in the left menu;
2) Ensure "Passive Transfers" is NOT selected;
3) click on Use. We need to deactivate Passive Transfers because YAFS, the FTP server included in Icaros, only allows active transfers at the current stage. Now, we can finally connect to our new file source:
1) Look into the address book for the newly introduced server, be sure that name and IP address are right, and
2) click on Connect. A new lister with server's "MyWorkspace" contents will appear. You can now transfer files over the network choosing a destination among your local (client's) volumes.
Can be adapted to any FTP client on any platform of your choice, just be sure your client allows Active Transfers as well.
===IRC Internet Relay Chat===
Jabberwocky is ideal for one-to-one social media communication, use IRC if you require one to many.
Just type a message in ''lowercase''' letters and it will be posted to all in the [ AROS irc channel]. Please do not use UPPER CASE as it is a sign of SHOUTING which is annoying.
Other things to type in - replace <message> with a line of text and <nick> with a person's name
<pre>
/help
/list
/who
/whois <nick>
/msg <nick> <message>
/query <nick>
<message>s
/query
/away <message>
/away
/quit <going away message>
</pre>
[http://irchelp.org/irchelp/new2irc.html#smiley Intro guide here]. IRC Primer can be found here in [http://www.irchelp.org/irchelp/ircprimer.html html], [http://www.irchelp.org/irchelp/text/ircprimer.txt TXT], [http://www.kei.com/irc/IRCprimer1.1.ps PostScript].
Issue the command /me <text> where <text> is the text that should follow your nickname.
Example: /me slaps ajk around a bit with a large trout
/nick <newNick>
/nickserv register <password> <email address>
/ns instead of /nickserv, while others might need /msg nickserv
/nickserv identify <password>
Alternatives:
/ns identify <password>
/msg nickserv identify <password>
==== IRC WookieChat ====
WookieChat is the most complete internet client for communication across the IRC Network. WookieChat allows you to swap ideas and communicate in real-time, you can also exchange Files, Documents, Images and everything else using the application's DCC capabilities.
add smilies drawer/directory
run wookiechat from the shell and set stack to 1000000 e.g. wookiechat stack 1000000
select a server / server window
* nickname
* user name
* real name - optional
Once you configure the client with your preferred screen name, you'll want to find a channel to talk in.
servers
* New Server - click on this to add / add extra - change details in section below this click box
* New Group
* Delete Entry
* Connect to server
* connect in new tab
* perform on connect
Change details
* Servername - change text in this box to one of the below Server:
* Port number - no need to change
* Server password
* Channel - add #channel from below
* auto join - can click this
* nick registration password,
Click Connect to server button above
<pre>
Server: irc.freenode.net
Channel: #aros
</pre>
irc://irc.freenode.net/aros
<pre>
Server: chat.amigaworld.net
Channel: #amigaworld or #amigans
</pre>
<pre>
On Sunday evenings USA time usually starting around 3PM EDT (1900 UTC)
Server:irc.superhosts.net
Channel #team*amiga
</pre>
<pre>
BitlBee and Minbif are IRCd-like gateways to multiple IM networks
Server: im.bitlbee.org
Port 6667
Seems to be most useful on WookieChat as you can be connected to several servers at once. One for Bitlbee and any messages that might come through that. One for your normal IRC chat server.
</pre>
[http://www.bitlbee.org/main.php/servers.html Other servers],
<pre>
#Amiga.org - irc.synirc.net eu.synirc.net dissonance.nl.eu.synirc.net (IPv6: 2002:5511:1356:0:216:17ff:fe84:68a)
twilight.de.eu.synirc.net zero.dk.eu.synirc.net us.synirc.net avarice.az.us.synirc.net envy.il.us.synirc.net harpy.mi.us.synirc.net
liberty.nj.us.synirc.net snowball.mo.us.synirc.net - Ports 6660-6669 7001 (SSL)
</pre>
<pre>
Multiple server support
"Perform on connect" scripts and channel auto-joins
Automatic Nickserv login
Tabs for channels and private conversations
CTCP PING, TIME, VERSION, SOUND
Incoming and Outgoing DCC SEND file transfers
Colours for different events
Logging and automatic reloading of logs
mIRC colour code filters
Configurable timestamps
GUI for changing channel modes easily
Configurable highlight keywords
URL Grabber window
Optional outgoing swear word filter
Event sounds for tabs opening, highlighted words, and private messages
DCC CHAT support
Doubleclickable URL's
Support for multiple languages using LOCALE
Clone detection
Auto reconnection to Servers upon disconnection
Command aliases
Chat display can be toggled between AmIRC and mIRC style
Counter for Unread messages
Graphical nicklist and graphical smileys with a popup chooser
</pre>
====IRC Aircos ====
Double click on Aircos icon in Extras:Networking/Apps/Aircos. It has been set up with a guest account for trial purposes. Though ideally, choose a nickname and password for frequent use of irc.
====IRC and XMPP Jabberwocky====
Servers are setup and close down at random
You sign up to a server that someone else has setup and access chat services through them.
The two ways to access chat from jabberwocky
<pre >
Jabberwocky -> Server -> XMPP -> open and ad-free
Jabberwocky -> Server -> Transports (Gateways) -> Proprietary closed systems
</pre >
The Jabber.org service connects with all IM services that use XMPP, the open standard for instant messaging and presence over the Internet. The services we connect with include Google Talk (closed), Live Journal Talk, Nimbuzz, Ovi, and thousands more. However, you can not connect from Jabber.org to proprietary services like AIM, ICQ, MSN, Skype, or Yahoo because they don’t yet use XMPP components (XEP-0114) '''but''' you can use Jabber.com's servers and IM gateways (MSN, ICQ, Yahoo etc.) instead.
The best way to use jabberwocky is in conjunction with a public jabber server with '''transports''' to your favorite services, like gtalk, Facebook, yahoo, ICQ, AIM, etc.
You have to register with one of the servers, [https://list.jabber.at/ this list] or [http://www.jabberes.org/servers/ another list], [http://xmpp.net/ this security XMPP list],
Unfortunately jabberwocky can only connect to one server at a time so it is best to check what services each server offers. If you set it up with separate Facebook and google talk accounts, for example, sometimes you'll only get one or the other.
Jabberwocky open a window where the Jabber server part is typed in as well as your Nickname and Password.
Jabber ID (JID) identifies you to the server and other users.
Once registered the next step is to goto Jabberwocky's "Windows" menu and select the "Agents" option. The "Agents List" window will open.
Roster (contacts list)
[http://search.wensley.org.uk/ Chatrooms] (MUC) are available
File Transfer - can send and receive files through the Jabber service but not with other services like IRC, ICQ, AIM or Yahoo. All you need is an installed webbrowser and OpenURL.
Clickable URLs - The message window uses Mailtext.mcc and you can set a URL action in the MUI mailtext prefs like SYS:Utils/OpenURL %s NEWWIN.
There is no consistent Skype like (H.323 VoIP) video conferencing available over Jabber. The move from xmpp to Jingle should help but no support on any amiga-like systems at the moment. [http://aminet.net/package/dev/src/AmiPhoneSrc192 AmiPhone] and [http://www.lysator.liu.se/%28frame,faq,nobg,useframes%29/ahi/v4-site/ Speak Freely] was an early attempt voice only contact. SIP and Asterisk are other PBX options.
Facebook
If you're using the XMPP transport provided by Facebook themselves, chat.facebook.com, it looks like they're now requiring SSL transport. This means jabberwocky method below will no longer work. The best thing to do is to create an ID on a public jabber server which has a Facebook gateway.
<pre >
1. launch jabberwocky
2. if the login window doesn't appear on launch, select 'account' from the jabberwocky menu
3. your jabber ID will be user@chat.facebook.com where user is your user ID
4. your password is your normal facebook password
5. to save this for next time, click the popup gadget next to the ID field
6. click the 'add' button
7. click the 'close' button
8. click the 'connect' button
</pre >
you're done. you can also click the 'save as default account' button if you want. jabberwocky configured to auto-connect when launching the program, but you can configure as you like. there is amigaguide documentation included with jabberwocky.
[http://amigaworld.net/modules/newbb/viewtopic.php?topic_id=37085&forum=32 Read more here]
for Facebook users, you can log-in directly to Facebook with jabberwocky. just sign in as @chat.facebook.com with your Facebook password as the password
Twitter
For a few years, there has been added a twitter transport. Servers include [http://jabber.hot-chilli.net/ jabber.hot-chili.net], and .
An [http://jabber.hot-chilli.net/tag/how-tos/ How-to]
:Read [http://jabber.hot-chilli.net/2010/05/09/twitter-transport-working/ more]
Instagram
no support at the moment best to use a web browser based client
ICQ
The new version (beta) of StriCQ uses a newer ICQ protocol. Most of the ICQ Jabber Transports still use an older ICQ protocol. You can only talk one-way to StriCQ using the older Transports. Only the newer ICQv7 Transport lets you talk both ways to StriCQ. Look at the server lists in the first section to check.
Register on a Jabber server, e.g. this one works: http://www.jabber.de/
Then login into Jabberwocky with the following login data e.g. xxx@jabber.de / Password: xxx Now add your ICQ account under the window->Agents->"Register". Now Jabberwocky connects via the Jabber.de server with your ICQ account.
Yahoo Messenger
although yahoo! does not use xmpp protocol, you should be able to use the transport methods to gain access and post your replies
MSN
early months of 2013 Microsoft will ditch MSN Messenger client and force everyone to use Skype...but MSN protocol and servers will keep working as usual for quite a long time....
Occasionally the Messenger servers have been experiencing problems signing in. You may need to sign in at www.outlook.com and then try again. It may also take multiple tries to sign in. (This also affects you if you’re using Skype.)
You have to check each servers' Agents List to see what transports (MSN protocol, ICQ protocol, etc.) are supported or use the list address' provided in the section above. Then register with each transport (IRC, MSN, ICQ, etc.) to which you need access. After registering you can Connect to start chatting.
msn.jabber.com/registered should appear in the window.
From this [http://tech.dir.groups.yahoo.com/group/amiga-jabberwocky/message/1378 JW group] guide which helps with this process in a clear, step by step procedure.
1. Sign up on MSN's site for a passport account. This typically involves getting a Hotmail address.
2. Log on to the Jabber server of your choice and do the following:
* Select the "Windows/Agents" menu option in Jabberwocky.
* Select the MSN Agent from the list presented by the server.
* Click the Register button to open a new window asking for:
**Username = passort account email address, typically your hotmail address.
**Nick = Screen name to be shown to anyone you add to your buddy list.
**Password = Password for your passport account/hotmail address.
* Click the Register button at the bottom of the new window.
3. If all goes well, you will see the MSN Gateway added to your buddy list. If not, repeat part 2 on another server. Some servers may show MSN in their list of available agents, but have not updated their software for the latest protocols used by MSN.
4. Once you are registered, you can now add people to your buddy list. Note that you need to include the '''msn.''' ahead of the servername so that it knows what gateway agent to use. Some servers may use a slight variation and require '''msg.gate.''' before the server name, so try both to see what works.
If my friend's msn was amiga@hotmail.co.uk and my jabber server was @jabber.meta.net.nz..
then amiga'''%'''hotmail.com@'''msn.'''jabber.meta.net.nz
or another the trick to import MSN contacts is that you don't type the hotmail URL but the passport URL... e.g. Instead of: goodvibe%hotmail.com@msn.jabber.com You type: goodvibe%passport.com@msn.jabber.com
And the thing about importing contacts I'm afraid you'll have to do it by hand, one at the time...
Google Talk
any XMPP server will work, but you have to add your contacts manually. a google talk user is typically either @gmail.com or @talk.google.com. a true gtalk transport is nice because it brings your contacts to you and (can) also support file transfers to/from google talk users.
implement Jingle a set of extensions to the IETF's Extensible Messaging and Presence Protocol (XMPP)
support ended early 2014 as Google moved to Google+ Hangouts which uses it own proprietary format
===Video Player MPlayer===
Many of the menu features (such as doubling) do not work with the current version of mplayer but using
4:3
mplayer -vf scale=800:600 file.avi
16:9
mplayer -vf scale=854:480 file.avi
if you want gui use;
mplayer -gui 1 <other params> file.avi
<pre >
stack 1000000
; using AspireOS 1.xx
; copy FROM SYS:Extras/Multimedia/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
; using Icaros Desktop 1.x
; copy FROM SYS:Tools/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
; using Icaros Desktop 2.x
; copy FROM SYS:Utilities/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
cd RAM:MPlayer
run MPlayer -gui > Nil:
;run MPlayer -gui -ao ahi_dev -playlist http://www.radio-paralax.de/listen.pls > Nil:
</pre >
$ mplayer rtsp://127.0.0.1:554/sample_300kbit.mp4
MPlayer supports multicast streaming, and rtp/rtsp protocols (it might require [http://www.live555.com/openRTSP/ live555 library] to work with some streams). But you might have to build it where it's disabled. Also, multicast won't work with some AmiTCP-likes. MIAMI supported it, though.
AROS supports IPv4 (old but works) and this includes the needed address space for RTP.
If you mean multicast via RTP - mplayer handles it. You can even force UDP over TCP
-rtsp-stream-over-tcp
If the rtsp Real Time Streaming Protocol server needs authentification:
-user -passwd
MPlayer - Menu - Open Playlist and load already downloaded .pls or .m3u file - auto starts around 4 percent cache
MPlayer - Menu - Open Stream and copy one of the .pls lines below into space allowed, press OK and press play button on main gui interface
Old 8bit 16bit remixes chip tune game music
http://www.radio-paralax.de/listen.pls
http://scenesat.com/
http://www.shoutcast.com/radio/Amiga
http://www.theoldcomputer.com/retro_radio/RetroRadio_Main.htm
http://www.kohina.com/
http://www.remix64.com/
http://retrogamer.net/forum/
http://retroasylum.podomatic.com/rss2.xml
http://retrogamesquad.com/
http://www.retronauts.com/
http://monsterfeet.com/noquarter/
http://www.retrogamingradio.com/
http://www.radiofeeds.co.uk/mp3.asp
[[#top|...to the top]]
====ZunePaint====
simplified typical workflow
* importing and organizing and photo management
* making global and regional local correction(s) - recalculation is necessary after each adjustment as it is not in real-time
* exporting your images in the best format available with the preservation of metadata
Whilst achieving 80% of a great photo with just a filter, the remaining 20% comes from a manual fine-tuning of specific image attributes.
For photojournalism, documentary, and event coverage, minimal touching is recommended. Stick to Camera Raw for such shots, and limit changes to level adjustment, sharpness, noise reduction, and white balance correction.
For fashion or portrait shoots, a large amount of adjustment is allowed and usually ends up far from the original. Skin smoothing, blemish removal, eye touch-ups, etc. are common. Might alter the background a bit to emphasize the subject.
Product photography usually requires a lot of sharpening, spot removal, and focus stacking.
For landscape shots, best results are achieved by doing the maximum amount of preparation before/while taking the shot. No amount of processing can match timing, proper lighting, correct gear, optimal settings, etc. Excessive post-processing might give you a dramatic shot but best avoided in the long term.
* White Balance - Left Amiga or F12 and K and under "Misc color effects" tab with a pull down for White Balance - color temperature also known as AKA tint (movies) or tones (painting) - warm temp raise red reduce green blue - cool raise blue lower red green
* Exposure - exposure compensation, highlight/shadow recovery
* Noise Reduction - during RAW development or using external software
* Lens Corrections - distortion, vignetting, chromatic aberrations
* Detail - capture sharpening and local contrast enhancement
* Contrast - black point, levels (sliders) and curves tools (F12 and K)
* Framing - straighten () and crop (F12 and F)
* Refinements - color adjustments and selective enhancements - Left Amiga or F12 and K for RGB and YUV histogram tabs -
* Resizing - enlarge for a print or downsize for the web or email (F12 and D)
* Output Sharpening - customized for your subject matter and print/screen size
White Balance - F12 and K
scan your image for a shade which was meant to be white (neutral with each RGB value being equal) like paper or plastic which is in the same light as the subject of the picture. Use the dropper tool to select this color, similar colours will shift and you will have selected the perfect white balance for your part of the image - for the whole picture make sure RAZ or CLR button at the bottom is pressed before applying to the image above.
Exposure correction
F12 and K - YUV Y luminosity - RGB extra red tint - move red curve slightly down and move blue green curves slightly up
Workflows in practice
* Undo - Right AROS key or F12 and Z
* Redo - Right AROS key or F12 and R
First flatten your image (if necessary) and then do a rotation until the picture looks level.
* Crop the picture. Click the selection button and drag a box over the area of the picture you want to keep. Press the crop button and the rest of the photo will be gone.
* Adjust your saturation, exposure, hue levels, etc., (right AROS Key and K for color correction) until you are happy with the photo. Make sure you zoom in all of the way to 100% and look the photo over, zoom back out and move around. Look for obvious problems with the picture.
* After coloring and exposure do a sharpen (Right AROS key and E for Convolution and select drop down option needed), e.g. set the matrix to 5x5 (roughly equivalent Amount to 60%) and set the Radius to 1.0. Click OK.
And save your picture
Implemented or would like to see for simplification and ease of use
basic filters (presets) like black and white, monochrome, edge detection (sobel), motion/gaussian blur,
* negative, sepiatone, retro vintage, night vision, colour tint, color gradient, color temperature, glows, fire, lightning, lens flare, emboss, filmic, pixelate mezzotint, antialias, etc.
adjust / cosmetic tools such as crop,
* reshaping tools, straighten, smear, smooth, perspective, liquify, bloat, pucker, push pixels in any direction, dispersion, transform like warp, blending with soft light, page-curl, whirl, ripple, fisheye, neon, etc.
* red eye fixing, blemish remover, skin smoothing, teeth whitener, make eyes look brighter, desaturate,
effects like oil paint, cartoon, pencil sketch, charcoal, noise/matrix like sharpen/unsharpen, (right AROS key with A for Artistic effects)
* blend two image, gradient blend, masking blend, explode, implode, custom collage, surreal painting, comic book style, needlepoint, stained glass, watercolor, mosaic, stencil/outline, crayon, chalk, etc.
borders such as
* dropshadow, rounded, blurred, color tint, picture frame, film strip polaroid, bevelled edge, etc.
brushes e.g.
* frost, smoke, etc.
and manual control of
fix lens issues including vignetting (darkening), color fringing and barrel distortion, and chromatic and geometric aberration - lens and body profiles
perspective correction
levels - directly modify the levels of the tone-values of an image, by using sliders for highlights, midtones and shadows
curves - Color Adjustment and Brightness/Contrast
color balance
one single color transparent (alpha channel (color information/selections) for masking and/or blending ) for backgrounds, etc.
Threshold indicates how much other colors will be considered mixture of the removed color and non-removed colors
decompose layer into a set of layers with each holding a different type of pattern that is visible within the image
any selection using any selecting tools like lasso tool, marquee tool etc. the selection will temporarily be save to alpha
If you create your image without transparency then the Alpha channel is not present, but you can add later.
File formats like .psd (Photoshop file has layers, masks etc. contains edited sensor data. The original sensor data is no longer available) .xcf .raw .hdr
Image Picture Formats
* low dynamic range (JPEG, PNG, TIFF 8-bit), 16-bit (PPM, TIFF), typically as a 16-bit TIFF in either ProPhoto or AdobeRGB colorspace - TIFF files are also fairly universal – although, if they contain proprietary data, such as Photoshop Adjustment Layers or Smart Filters, then they can only be opened by Photoshop making them proprietary.
* linear high dynamic range (HDR) images (PFM, [http://www.openexr.com/ ILM .EXR], jpg, [http://aminet.net/util/dtype cr2] (canon tiff based), hdr, NEF, CRW, ARW, MRW, ORF, RAF (Fuji), PEF, DCR, SRF, ERF, DNG files are RAW converted to an Adobe proprietary format - a container that can embed the raw file as well as the information needed to open it)
An old version of [http://archives.aros-exec.org/index.php?function=browse&cat=graphics/convert dcraw]
There is no single RAW file format. Each camera manufacturer has one or more unique RAW formats. RAW files contain the brightness levels data captured by the camera sensor. This data cannot be modified. A second smaller file, separate XML file, or within a database with instructions for the RAW processor to change exposure, saturation etc. The extra data can be changed but the original sensor data is still there. RAW is technically least compatible.
A raw file is high-bit (usually 12 or 14 bits of information) but a camera-generated TIFF file will be usually converted by the camera (compressed, downsampled) to 8 bits. The raw file has no embedded color balance or color space, but the TIFF has both. These three things (smaller bit depth, embedded color balance, and embedded color space) make it so that the TIFF will lose quality more quickly with image adjustments than the raw file. The camera-generated TIFF image is much more like a camera processed JPEG than a raw file. A strong advantage goes to the raw file. The power of RAW files, such as the ability to set any color temperature non-destructively and will contain more tonal values.
The principle of preserving the maximum amount of information to as late as possible in the process. The final conversion - which will always effectively represent a "downsampling" - should prevent as much loss as possible.
Once you save it as TIFF, you throw away some of that data irretrievably. When saving in the lossy JPEG format, you get tremendous file size savings, but you've irreversibly thrown away a lot of image data. As long as you have the RAW file, original or otherwise, you have access to all of the image data as captured.
Keyboard equivalence with Photoshop(tm) would help
File
PHOTOSHOP SHORTCUT GIMP
New Ctrl+n New
Open Ctrl+o Open
Close Ctrl+w Close
Save Ctrl+s Save
Save as Shift+Ctrl+s Save as
Revert F12 Revert
Print Ctrl+p Print
Exit Ctrl+q Quit
Edit
PHOTOSHOP SHORTCUT GIMP
Undo/Redo (1 level) Ctrl+z Undo (Redo is Shift+Ctrl+z)
Cut Ctrl+x Cut
Copy Ctrl+c Copy
Paste Ctrl+v Paste
Paste Into Shift+Ctrl+v Paste Into
Fill with FG color Alt+Backspace Fill with FG color
Fill with BG color Control+Backspace Fill with BG color
Image/Colors
PHOTOSHOP SHORTCUT GIMP
Levels Ctrl+l Levels
Auto Contrast Shift+Ctrl+Alt+l Stretch Contrast (same?)
Curves Ctrl+m Curves
Color Balance Ctrl+b Color Balance
Hue/Saturation Ctrl+u Hue-Saturation
Desaturate Shift+Ctrl+u Desaturate
Invert Ctrl+i Invert
Default Colors d Default Colors
Switch Colors x Switch Colors
Layer
PHOTOSHOP SHORTCUT GIMP
New Layer Shift+Ctrl+n New Layer
Layer via Copy Ctrl+j Duplicate Layer
Bring (layer) to Front Shift+Ctrl+] Layer to Top
Send (layer) to Back Shift+Ctrl+[ Layer to Bottom
Bring (layer) Forward Ctrl+] Raise Layer
Send (layer) Backward Ctrl+[ Lower Layer
Select Top Layer Shift+Alt+] Select Top Layer
Select Bottom Layer Shift+Alt+[ Select Bottom Layer
Select One Layer Forward Alt+] Select Previous Layer
Select One Layer Backward Alt+[ Select Next Layer
Merge Down Ctrl+e Merge Down
Merge Visible Shift+Ctrl+e Merge Visible
Preserve Transparency / Keep Transparency
Cycle Modes Forwards Shift+= Next Layer Mode
Cycle Modes Backwards Shift+- Previous Layer Mode
Select
PHOTOSHOP SHORTCUT GIMP
Select All Ctrl+a Select All
Deselect Ctrl+d Select None
Inverse Shift+Ctrl+i Invert
Feather Ctrl+Alt+d Feather
View
PHOTOSHOP SHORTCUT GIMP
Zoom In Ctrl+= Zoom In
Zoom Out Ctrl+- Zoom Out
Fit on Screen Ctrl+0 Zoom to Fit Window
Actual Pixels Ctrl+Alt+0 Zoom 1:1
Show/Hide Extras Ctrl+h Toggle Show Selection (close enough?)
Show/Hide Guides Ctrl+' Toggle Show Guides
Show/Hide Grid Ctrl+Alt+' Toggle Show Grid
Show/Hide Rulers Ctrl+r Toggle Show Rulers
Snap Ctrl+; Snap to Guides
Scroll View Up Page Up Scroll Page Up
Scroll View Down Page Down Scroll Page Down
Scroll View Left Ctrl+Page Up Scroll Page Left
Scroll View Right Ctrl+Page Down Scroll Page Right
Window/Dialogs
PHOTOSHOP SHORTCUT GIMP
? F5 Tools Dialog
Color Tab F6 Colors Dialog
Layers Tab F7 Layers Dialog
Info Tab F8 Image Information
Tools
PHOTOSHOP SHORTCUT GIMP
Rectangular Marquee Tool m Rect Select Tool
Elliptical Marquee Tool Shift+m Ellipse Select Tool
*This is a toggle between 'Elliptical Marquee Tool' and 'Rectangular Marquee Tool' in Photoshop
Move Tool v Move Tool
Lasso Tool l Free Select Tool
Magic Wand Tool w Fuzzy Select Tool
Crop Tool c Crop & Resize Tool
Airbrush Tool j Airbrush Tool
Paintbrush Tool b Paintbrush Tool
Clone Stamp Tool s Clone Stamp Tool
Eraser Tool e Eraser Tool
Gradient Tool g Blend Tool
Paint Bucket Tool Shift+g Bucket Fill Tool
*This is a toggle between 'Paint Bucket Tool' and 'Gradient Tool' in Photoshop
Blur Tool r Convolve Tool
Dodge Tool o DodgeBurn Tool
Type Tool t Text Tool
Pen Tool p Bezier Select Tool
Eye Dropper Tool i Color Picker Tool
Zoom Tool z Magnify Tool
Previous Brush , Previous Brush
Next Brush . Next Brush
First Brush Shift+< First Brush
Last Brush Shift+> Last Brush
Decrease Brush Size [ Decrease Brush Size
Increase Brush Size ] Increase Brush Size
Decrease Brush Hardness { Decrease Brush Hardness
Increase Brush Hardness } Increase Brush Hardness
Help
PHOTOSHOP SHORTCUT GIMP
Help F1 Help
Context Help Shift+F1 Context Help
Misc.
PHOTOSHOP SHORTCUT GIMP
Last Filter Ctrl+f Repeat Last Filter
? Shift+Ctrl+f Reshow Last Filter
Preferences Ctrl+k Preferences
Liquify Shift+Ctrl+x IWarp (close enough?)
Toggle Quick Mask q Toggle Quick Mask
Spotlights - triangle of white opaque shape
Cutting out and/or replacing unwanted background or features - select large areas with the selection option like the Magic Wand tool (aka Color Range) or the Lasso (quick and fast) with feather 2 to soften edge or the pen tool which adds points/lines/Bézier curves (better control but slower), hold down the shift button as you click to add extra points/areas of the subject matter to remove. Increase the tolerance to cover more areas. To subtract from your selection hold down alt as you're clicking.
* Layer masks are a better way of working than Erase they clip (black hides/hidden white visible/reveal). Clone Stamp can be simulated by and brushes for other areas.
* Leave the fine details like hair, fur, etc. to later with lasso and the shift key to draw a line all the way around your subject. Gradient Mapping - Inverse - Mask. i.e. Refine your selected image with edge detection and using the radius and edge options / adjuster (increase/decrease contrast) so that you will capture more fine detail from the background allowing easier removal.
Remove fringe/halo
saving image as png rather than jpg/jpeg to keep transparency background intact.
Implemented [http://colorizer.org/ colour model representations] [http://paulbourke.net/texture_colour/colourspace/ Mathematical approach] - Photo stills are spatially 2d (h and w), but are colorimetrically 3d (r g and b, or H L S, or Y U V etc.) as well.
* RGB - split cubed mapped color model for photos and computer graphics hardware using the light spectrum (adding and subtracting)
* YUV - Y-Lightness U-blue/yellow V-red/cyan (similar to YPbPr and YCbCr) used in the PAL, NTSC, and SECAM composite digital TV color [http://crewofone.com/2012/chroma-subsampling-and-transcoding/#comment-7299 video]
Histograms
White balanced (neutral) if the spike happens in the same place in each channel of the RGB graphs. If not, you're not balanced.
If you have sky you'll see the blue channel further off to the right.
RGB is best one to change colours. These elements RGB is a 3-channel format containing data for Red, Green, and Blue in your photo scale between 0 and 255. The area in a picture that appears to be brighter/whiter contains more red color as compared to the area which is relatively darker. Similarly in the green channel the area that appears to be darker contains less amount of green color as compared to the area that appears to be brighter. Similarly in the blue channel the area appears to be darker contains less amount of blue color as compared to the area that appears to be brighter. Brightness luminance histogram also matches the green histogram more than any other color - human eye interprets green better e.g. RGB rough ratio 15/55/30%
RGBA (RGB+A, A means alpha channel) . The alpha channel is used for "alpha compositing", which can mostly be associated as "opacity". AROS deals in RGB with two digits for every color (red, green, blue), in ARGB you have two additional hex digits for the alpha channel.
The shadows are represented by the left third of the graph. The highlights are represented by the right third. And the midtones are, of course, in the middle. The higher the black peaks in the graph, the more pixels are concentrated in that tonal range (total black area).
By moving the black endpoint, which identifies the shadows (darkness) and a white light endpoint (brightness) up and down either sides of the graph, colors are adjusted based on these points.
By dragging the central one, can increased the midtones and control the contrast, raise shadows levels, clip or softly eliminate unsafe levels, alter gamma, etc... in a way that is much more precise and creative .
RGB Curves
* Move left endpoint (black point) up or right endpoint (white point) up brightens
* Move left endpoint down or right endpoint down darkens
Color Curves
* Dragging up on the Red Curve increases the intensity of the reds in the image but
* Dragging down on the Red Curve decreases the intensity of the reds and thus increases the apparent intensity of its complimentary color, cyan. Green’s complimentary color is magenta, and blue’s is yellow.
<pre>
Red <-> Cyan
Green <->Magenta
Blue <->Yellow
</pre>
YUV Best option to analyse and pull out statistical elements of any picture (i.e. separate luminance data from color data). The line in Y luma tone box represents the brightness of the image with the point in the bottom left been black, and the point in the top right as white. A low-contrast image has a concentrated clump of values nearer to the center of the graph. By comparison, a high-contrast image has a wider distribution of values across the entire width of the Histogram. A histogram that is skewed to the right would indicate a picture that is a bit overexposed because most of the color data is on the lighter side (increase exposure with higher value F), while a histogram with the curve on the left shows a picture that is underexposed. This is good information to have when using post-processing software because it shows you not only where the color data exists for a given picture, but also where any data has been clipped (extremes on edges of either side): that is, it does not exist and, therefore, cannot be edited. By dragging the endpoints of the line and as well as the central one, can increased the dark/shadows, midtones and light/bright parts and control the contrast, raise shadows levels, clip or softly eliminate unsafe levels, alter gamma, etc... in a way that is much more precise and creative .
The U and V chroma parts show color difference components of the image. It’s useful for checking whether or not the overall chroma is too high, and also whether it’s being limited too much
Can be used to create a negative image but also
With U (Cb), the higher value you are, the more you're on the blue primary color. If you go to the low values then you're on blue complementary color, i.e. yellow.
With V (Cr), this is the same principle but with Red and Cyan.
e.g. If you push U full blue and V full red, you get magenta. If you push U full yellow and V full Cyan then you get green.
YUV simultaneously adds to one side of the color equation while subtracting from the other.
using YUV to do color correction can be very problematic because each curve alters the result of each other: the mutual influence between U and V often makes things tricky. You may also be careful in what you do to avoid the raise of noise (which happens very easily). Best results are obtained with little adjustments
sunset that looks uninspiring and needs some color pop especially for the rays over the hill, a subtle contrast raise while setting luma values back to the legal range without hard clipping.
====Lunapaint====
Pixel based drawing app with onion-skin animation function
Blocking, Shading, Coloring, adding detail
<pre>
b BRUSH
e ERASER
alt eyedropper
v layer tool
z ZOOM / MAGNIFY < > n
spc panning
m marque
q lasso
w same color selection / region
</pre>
<pre>
, LM RM
v
V
f filter
F
. size
p
, pick color
[] last / next color
</pre>
There is not much missing in Lunapaint to be as good as FlipBook and then you have to take into account that Flipbook is considered to be amongst the best and easiest to use animation software out there. Ok to be honest Flipbook has some nice features that require more heavy work but those aren't so much needed right away, things like camera effects, sound, smart fill, export to different movie file formats etc.
Tried Flipbook with my tablet and compared it to Luna. The feeling is the same when sketching. LunaPaint is very responsive/fluent to draw with. Just as Flipbook is, and that responsiveness is something its users have mentioned as one of the positive sides of said software.
author was learning MUI. Some parts just have to be rewritten with proper MUI classes before new features can be added.
* add [Frame Add] / [Frame Del]
* whole animation feature is impossible to use. If you draw 2 color maybe but if you start coloring your cells then you get in trouble
* pickup the entire image as a brush, not just a selection ? And consequently remove the brush from memory when one doesn't need it anymore. can pick up a brush and put it onto a new image but cropping isn't possible, nor to load/save brushes.
* Undo is something I longed for ages in Lunapaint.
* to import into the current layer, other types of images (e.g. JPEG) besides RAW64.
* implement graphic tablet features support
**GENERAL DRAWING**
Miss it very much:
UNDO
ERASER
COLORPICKER - has to show on palette too which color got picked.
BACKGROUND COLOR -Possibility to select from "New project screen"
Miss it somewhat:
ICON for UNDO
ICON for ERASER
ICON for CLEAR SCREEN ( What can I say? I start over from scratch very often )
BRUSH - possibility to cut out as brush not just copy off image to brush
**ANIMATING**
Miss it very much:
NUMBER OF CELLS - Possibity to change total no. of cells during project
ANIM BRUSH - Possibility to pick up a selected part of cells into an animbrush
Miss it somewhat:
ADD/REMOVE FRAMES: Add/remove single frame
In general LunaPaint is really well done and it feels like a new DeluxePaint version. It works with my tablet. Sure there's much missing of course but things can always be added over time. So there is great potential in LunaPaint that's for sure. Animations could be made in it and maybe put together in QuickVideo, saving in .gif or .mng etc some day.
LAYERS
-Layers names don't get saved globally in animation frames
-Layers order don't change globally in an animation (perhaps as default?).
EXPORTING IMAGES
-Exporting frames to JPG/PNG gives problems with colors. (wrong colors. See my animatiopn --> My robot was blue now it's "gold" ) I think this only happens if you have layers.
-Trying to flatten the layers before export doesn't work if you have animation frames only the one you have visible will flatten properly all other frames are destroyed. (Only one of the layers are visible on them)
-Exporting images filenames should be for example e.g. file0001, file0002...file0010 instead as of now file1, file2...file10
LOAD/SAVE (Preferences)
-Make a setting for the default "Work" folder.
* Destroyed colors if exported image/frame has layers
* mystic color cycling of the selected color while stepping frames back/forth (annoying)
<pre>
Deluxe Paint II enhanced key shortcuts
NOTE: @ denotes the ALT key
[Technique]
F1 - Paint
F2 - Single Colour
F3 - Replace
F4 - Smear
F5 - Shade
F6 - Cycle
F7 - Smooth
M - Colour Cycle
[Brush]
B - Restore
O - Outline
h - Halve brush size
H - Double brush size
x - Flip brush on X axis
X - Double brush size on X axis only
y - Flip on Y
Y - Double on Y
z - Rotate brush 90 degrees
Z - Stretch
[Stencil]
` - Stencil On
[Miscellaneous]
F9 - Info Bar
F10 - Selection Bar
@o - Co-Ordinates
@a - Anti-alias
@r - Colourise
@t - Translucent
TAB - Colour Cycle
[Picture]
L - Load
S - Save
j - Page to Spare(Flip)
J - Page to Spare(Copy)
V - View Page
Q - Quit
[General Keys]
m - Magnify
< - Zoom In
> - Zoom Out
[ - Palette Colour Up
] - Palette Colour Down
( - Palette Colour Left
) - Palette Colour Right
, - Eye Dropper
. - Pixel / Brush Toggle
/ - Symmetry
| - Co-Ordinates
INS - Perspective Control
+/- - Brush Size (Fine Control)
w - Unfilled Polygon
W - Filled Polygon
e - Unfilled Ellipse
E - Filled Ellipse
r - Unfilled Rectangle
R - Filled Rectangle
t - Type/text tool
a - Select Font
u/U - Undo
d - Brush
D - Filled Non-Uniform Polygon
f/F - Fill Options
g/G - Grid
h/H - Brush Size (Coarse Control)
K - Clear
c - Unfilled Circle
C - Filled Circle
v - Line
b - Scissor Select and Toggle
B - Brush
{,} - Toggle between two background colours
</pre>
====Lodepaint====
Pixel based painting artwork app
====Grafx2====
Pixel based painting artwork app aesprite like
[https://www.youtube.com/watch?v=59Y6OTzNrhk aesprite workflow keys and tablet use], [],
====Vector Graphics ZuneFIG====
Vector Image Editing of files .svg .ps .eps
*Objects - raise lower rotate flip aligning snapping
*Path - unify subtract intersect exclude divide
*Colour - fill stroke
*Stroke - size
*Brushes -
*Layers -
*Effects - gaussian bevels glows shadows
*Text -
*Transform -
AmiFIG ([http://epb.lbl.gov/xfig/frm_introduction.html xfig manual])
[[File:MyScreen.png|thumb|left|alt=Showing all Windows open in AmiFIG.|All windows available to AmiFIG.]]
for drawing simple to intermediate vector graphic images for scientific and technical uses and for illustration purposes for those with talent
;Menu options
* Load - fig format but import(s) SVG
* Save - fig format but export(s) eps, ps, pdf, svg and png
* PAN = Ctrl + Arrow keys
* Deselect all points
There is no selected object until you apply the tool, and the selected object is not highlighted.
;Metrics - to set up page and styles - first window to open on new drawings
;Tools - Drawing Primitives - set Attributes window first before clicking any Tools button(s)
* Shapes - circles, ellipses, arcs, splines, boxes, polygon
* Lines - polylines
* Text "T" button
* Photos - bitmaps
* Compound - Glue, Break, Scale
* POINTs - Move, Add, Remove
* Objects - Move, Copy, Delete, Mirror, Rotate, Paste
use right mouse button to stop extra lines, shapes being formed and the left mouse to select/deselect tools button(s)
* Rotate - moves in 90 degree turns centered on clicked POINT of a polygon or square
;Attributes which provide change(s) to the above primitives
* Color
* Line Width
* Line Style
* arrowheads
;Modes
Choose from freehand, charts, figures, magnet, etc.
;Library - allows .fig clip-art to be stored
* compound tools to add .fig(s) together
;FIG 3.2 [http://epb.lbl.gov/xfig/fig-format.html Format] as produced by xfig version 3.2.5
<pre>
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
4 0 0 50 -1 0 12 0.0000 4 135 1050 1050 2475 This is a test.01
</pre>
# change the text alignment within the textbox. I can choose left, center, or right aligned by either changing the integer in the second column from 0 (left) to 1 or 2 (center, or right).
# The third integer in the row specifies fontcolor. For instance, 0 is black, but blue is 1 and Green3 is 13.
# The sixth integer in the bottom row specifies fontface. 0 is Times-Roman, but 16 is Helvetica (a MATLAB default).
# The seventh number is fontsize. 12 represents a 12pt fontsize. Changing the fontsize of an item really is as easy as changing that number to 20.
# The next number is the counter-clockwise angle of the text. Notice that I have changed the angle to .7854 (pi/4 rounded to four digits=45 degrees).
# twelfth number is the position according to the standard “x-axis” in Xfig units from the left. Note that 1200 Xfig units is equivalent to once inch.
# thirteenth number is the “y-position” from the top using the same unit convention as before.
* The nested text string is what you entered into the textbox.
* The “01″ present at the end of that line in the .fig file is the closing tag. For instance, a change to \100 appends a @ symbol at the end of the period of that sentence.
; Just to note there are no layers, no 3d functions, no shading, no transparency, no animation
[[#top|...to the top]]
===Audio===
# AHI uses linear panning/balance, which means that in the center, you will get -6dB. If an app uses panning, this is what you will get. Note that apps like Audio Evolution need panning, so they will have this problem.
# When using AHI Hifi modes, mixing is done in 32-bit and sent as 32-bit data to the driver. The Envy24HT driver uses that to output at 24-bit (always).
# For the Envy24/Envy24HT, I've made 16-bit and 24-bit inputs (called Line-in 16-bit, Line-in 24-bit etc.). There is unfortunately no app that can handle 24-bit recording.
====Music Mods====
Digital module (mods) trackers are music creation software using samples and sometimes soundfonts, audio plugins (VST, AU or RTAS), MIDI.
Generally, MODs are similar to MIDI in that they contain note on/off and other sequence messages that control the mod player. Unlike (most) midi files, however, they also contain sound samples that the sequence information actually plays. MOD files can have many channels (classic amiga mods have 4, corresponding to the inbuilt sound channels), but unlike MIDI, each channel can typically play only one note at once. However, since that note might be a sample of a chord, a drumloop or other complex sound, this is not as limiting as it sounds.
Like MIDI, notes will play indefinitely if they're not instructed to end. Most trackers record this information automatically if you play your music in live. If you're using manual note entry, you can enter a note-off command with a keyboard shortcut - usually Caps Lock.
In fact when considering file size MOD is not always the best option. Even a dummy song wastes few kilobytes for nothing when a simple SID tune could be few hundreds bytes and not bigger than 64kB. AHX is another small format, AHX tunes are never larger than 64kB excluding comments.
[https://www.youtube.com/watch?v=rXXsZfwgil Protrekkr] (previously aka [w:Juan_Antonio_Arguelles_Rius|NoiseTrekkr])
If Protrekkr does not start, please check if the Unit 0 has been setup in the AHI prefs and still not, go to the directory utilities/protrekkr and double click on the Protrekkr icon
*Sample
*Note - Effect
*Track (column) - Pattern - Order
It all starts with the Sample which is used to create Note(s) in a Track (column of a tracker)
The Note can be changed with an Effect. A Track of Note(s) can be collected into a Pattern (section of a song) and these can be given Order to create the whole song.
Patience (notes have to be entered one at a time) or playing the bassline on a midi controller (faster - see midi section above). Best approach is to wait until a melody popped into your head.
*Up-tempo means the track should be reasonably fast, but not super-fast.
*Groovy and funky imply the track should have some sort of "swing" feel, with plenty of syncopation or off beat emphasis and a recognizable, melodic bass line.
*Sweet and happy mean upbeat melodies, a major key and avoiding harsh sounds.
*Moody - minor key
First, create a quick bass sound, which is basically a sine wave, but can be hand drawn for a little more variance. It could also work for the melody part, too.
This is usually a bass guitar or some kind of synthesizer bass. The bass line is often forgotten by inexperienced composers, but it plays an important role in a musical piece. Together with the rhythm section the bass line forms the groove of a song. It's the glue between the rhythm section and the melodic layer of a song.
The drums are just pink noise samples, played at different frequencies to get a slightly different sound for the kick, snare, and hihats.
Instruments that fall into the rhythm category are bass drums, snares, hi-hats, toms, cymbals, congas, tambourines, shakers, etc. Any percussive instrument can be used to form part of the rhythm section.
The lead is the instrument that plays the main melody, on top of the chords. There are many instruments that can play a lead section, like a guitar, a piano, a saxophone or a flute. The list is almost endless. There is a lot of overlap with instruments that play chords. Often in one piece an instrument serves both roles. The lead melody is often played at a higher pitch than the chords.
Listened back to what was produced so far, and a counter-melody can be imagined, which can be added with a triangle wave.
To give the ends of phrases some life, you can add a solo part with a crunchy synth. By hitting random notes in the key of G, then edited a few of them.
For the climax of the song, filled out the texture with a gentle high-pitch pad… …and a grungy bass synth.
The arrow at A points at the pattern order list. As you see, the patterns don't have to be in numerical order. This song starts with pattern "00", then pattern "02", then "03", then "01", etcetera. Patterns may be repeated throughout a song.
The B arrow points at the song title. Below it are the global BPM and speed parameters. These determine the tempo of the song, unless the tempo is altered through effect commands during the song.
The C arrow points at the list of instruments. An instrument may consist of multiple samples. Which sample will be played depends on the note. This can be set in the Instrument Editing screen. Most instruments will consist of just one sample, though. The sample list for the selected instrument can be found under arrow D.
Here's a part of the main editing screen. This is where you put in actual notes. Up to 32 channels can be used, meaning 32 sounds can play simultaneously. The first six channels of pattern "03" at order "02" are shown here. The arrow at A points at the row number. The B arrow points at the note to play, in this case a C4. The column pointed at by the C arrow tells us which instrument is associated with that note, in this case instrument #1 "Kick".
The column at D is used (mainly) for volume commands. In this case it is left empty which means the instrument should play at its default volume. You can see the volume column being used in channel #6.
The E column tells us which effect to use and any parameters for that effect. In this case it holds the "F" effect, which is a tempo command. The "04" means it should play at tempo 4 (a smaller number means faster).
Base pattern
When I create a new track I start with what I call the base pattern. It is worthwhile to spend some time polishing it as a lot of the ideas in the base pattern will be copied and used in other patterns. At least, that's how I work. Every musician will have his own way of working. In "Wild Bunnies" the base pattern is pattern "03" at order "02".
In the section about selecting samples I talked about the four different categories of instruments: drums, bass, chords and leads. That's also how I usually go about making the base pattern. I start by making a drum pattern, then add a bass line, place some chords and top it off with a lead. This forms the base pattern from which the rest of the song will grow.
Drums
Here's a screenshot of the first four rows of the base pattern. I usually reserve the first four channels or so for the drum instruments. Right away there are a couple of tricks shown here. In the first channel the kick, or bass drum, plays some notes. Note the alternating F04 and F02 commands. The "F" command alters the tempo of the song and by quickly alternating the tempo; the song will get some kind of "swing" feel.
In the second channel the closed hi-hat plays a fairly simple pattern. Further down in the channel, not shown here, some open hi-hat notes are added for a bit of variation.
In the third and fourth channel the snare sample plays. The "8" command is for panning. One note is panned hard to the left and the other hard to the right. One sample is played a semitone lower than the other. This results in a cool flanging effect. It makes the snare stand out a little more in the mix.
Bass line
There are two different instruments used for the bass line. Instrument #6 is a pretty standard synthesized bass sound. Instrument #A sounds a bit like a slap bass when used with a quick fade out. By using two different instruments the bass line sounds a bit more ”human”. The volume command is used to cut off the notes. However, it is never set to zero. Setting the volume to a very small value will result in a reverb-like effect. This makes the song sound more "live".
The bass line hints at the chords that will be played and the key the song will be in. In this case the key of the song is D-major, a positive and happy key.
Chords
The D major chords that are being played here are chords stabs; short sounds with a quick decay (fade out). Two different instruments (#8 and #9) are used to form the chords. These instruments are quite similar, but have a slightly different sound, panning and volume decay. Again, the reason for this is to make the sound more human. The volume command is used on some chords to simulate a delay, to achieve more of a live feel. The chords are placed off-beat making for a funky rhythm.
Lead
Finally the lead melody is added. The other instruments are invaluable in holding the track together, but the lead melody is usually what catches people's attention.
A lot of notes and commands are used here, but it looks more complex than it is. A stepwise ascending melody plays in channel 13. Channel 14 and 15 copy this melody, but play it a few rows later at a lower volume. This creates an echo effect. A bit of panning is used on the notes to create some stereo depth. Like with the bass line, instead of cutting off notes the volume is set to low values for a reverb effect. The "461" effect adds a little vibrato to the note, which sounds nice on sustained notes.
Those paying close attention may notice the instrument used here for the lead melody is the same as the one used for the bass line (#6 "Square"), except played two or three octaves higher. This instrument is a looped square wave sample. Each type of wave has its own quirks, but the square wave (shown below) is a really versatile wave form.
Song structure
Good, catchy songs are often carefully structured into sections, some of which are repeated throughout the song with small variations.
A typical pop-song structure is: Intro - Verse - Chorus - Verse - Chorus - Bridge - Chorus.
Other single sectional song structures are
<pre>
Strophic or AAA Song Form - oldest story telling with refrain (often title of the song) repeated in every verse section melody
AABA Song Form - early popular, jazz and gospel fading during the 1960s
AB or Verse/Chorus Song Form - songwriting format of choice for modern popular music since the 1960s
Verse/Chorus/Bridge Song Form
ABAB Song Form
ABAC Song Form
ABCD Song Form
AAB 12-Bar Song Form - three four-bar lines or sub-sections
8-Bar Song Form
16-Bar Song Form
Hybrid / Compound Song Forms
</pre>
The most common building blocks are:
#INTRODUCTION(INTRO)
#VERSE
#REFRAIN
#PRE-CHORUS / RISE / CLIMB
#CHORUS
#BRIDGE
#MIDDLE EIGHT
#SOLO / INSTRUMENTAL BREAK
#COLLISION
#CODA / OUTRO
#AD LIB (OFTEN IN CODA / OUTRO)
The chorus usually has more energy than the verse and often has a memorable melody line. As the chorus is repeated the most often during the song, it will be the part that people will remember.
The bridge often marks a change of direction in the song. It is not uncommon to change keys in the bridge, or at least to use a different chord sequence. The bridge is used to build up tension towards the big finale, the last repetition of chorus.
Playing
RCTRL: Play song from row 0.
LSHIFT + RCTRL: Play song from current row.
RALT: Play pattern from row 0.
LSHIFT + RALT: Play pattern from current row.
Left mouse on '>': Play song from row 0.
Right mouse on '>': Play song from current row.
Left mouse on '|>': Play pattern from row 0.
Right mouse on '|>': Play pattern from current row.
Left mouse on 'Edit/Record': Edit mode on/off.
Right mouse on 'Edit/Record': Record mode on/off.
Editing
LSHIFT + ESCAPE: Switch large patterns view on/off
TAB: Go to next track
LSHIFT + TAB: Go to prev. track
LCTRL + TAB: Go to next note in track
LCTRL + LSHIFT + TAB: Go to prev. note in track
SPACE: Toggle Edit mode On & Off
(Also stop if the song is being played)
SHIFT SPACE: Toggle Record mode On & Off
(Wait for a key note to be pressed
or a midi in message to be received)
DOWN ARROW: 1 Line down
UP ARROW: 1 Line up
LEFT ARROW: 1 Row left
RIGHT ARROW: 1 Row right
PREV. PAGE: 16 Arrows Up
NEXT PAGE: 16 Arrows Down
HOME / END: Top left / Bottom right of pattern
LCTRL + HOME / END: First / last track
F5, F6, F7, F8, F9: Jump to 0, 1/4, 2/4, 3/4, 4/4 lines of the patterns
+ - (Numeric keypad): Next / Previous pattern
LCTRL + LEFT / RIGHT: Next / Previous pattern
LCTRL + LALT + LEFT / RIGHT: Next / Previous position
LALT + LEFT / RIGHT: Next / Previous instrument
LSHIFT + M: Toggle mute state of the current channel
LCTRL + LSHIFT + M: Solo the current track / Unmute all
LSHIFT + F1 to F11: Select a tab/panel
LCTRL + 1 to 4: Select a copy buffer
Tracking
1st and 2nd keys rows: Upper octave row
3rd and 4th keys rows: Lower octave row
RSHIFT: Insert a note off
/ and * (Numeric keypad)
or F1 F2: -1 or +1 octave
INSERT / BACKSPACE: Insert or Delete a line in current track
or current selected block.
LSHIFT + INSERT / BACKSPACE: Insert or Delete a line in current pattern
DELETE (NOT BACKSPACE): Empty a column or a selected block.
Blocks
(Blocks can also be selected with the mouse by holding the right button and scrolling the pattern with the mouse wheel).
LCTRL + A: Select entire current track
LCTRL + LSHIFT + A: Select entire current pattern
LALT + A: Select entire column note in a track
LALT + LSHIFT + A: Select all notes of a track
LCTRL + X: Cut the selected block and copy it into the block-buffer
LCTRL + C: Copy the selected block into the block-buffer
LCTRL + V: Paste the data from the block buffer into the pattern
LCTRL + I: Interpolate selected data from the first to the last row of a selection
LSHIFT + ARROWS
PREV. PAGE
NEXT PAGE: Select a block
LCTRL + R: Randomize the select columns of a selection, works similar to CTRL + I (interpolating them)
LCTRL + U: Transpose the note of a selection to 1 seminote higher
LCTRL + D: Transpose the note of a selection to 1 seminote lower
LCTRL + LSHIFT + U: Transpose the note of a selection to 1 seminote higher (only for the current instrument)
LCTRL + LSHIFT + D: Transpose the note of a selection to 1 seminote lower (only for the current instrument)
LCTRL + H: Transpose the note of a selection to 1 octave higher
LCTRL + L: Transpose the note of a selection to 1 octave lower
LCTRL + LSHIFT + H: Transpose the note of a selection to 1 octave higher (only for the current instrument)
LCTRL + LSHIFT + L: Transpose the note of a selection to 1 octave lower (only for the current instrument)
LCTRL + W: Save the current selection into a file
Misc
LALT + ENTER: Switch between full screen / windowed mode
LALT + F4: Exit program (Windows only)
LCTRL + S: Save current module
LSHIFT + S: Switch top right panel to synths list
LSHIFT + I: Switch top right panel to instruments list
<pre>
C-x xh xx xx hhhh Volume
B-x xh xx xx hhhh Jump to
A#x xh xx xx hhhh hhhh Slide
F-x xh xx xx hhhh Tempo
D-x xh xx xx hhhh Pattern Break
G#x xh xx xx hhhh
</pre>
h Hex 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
d Dec 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
The Set Volume command: C. Input a note, then move the cursor to the effects command column and type a C. Play the pattern, and you shouldn't be able to hear the note you placed the C by. This is because the effect parameters are 00. Change the two zeros to a 40(Hex)/64(Dec), depending on what your tracker uses. Play back the pattern again, and the note should come in at full volume.
The Position Jump command next. This is just a B followed by the position in the playing list that you want to jump to. One thing to remember is that the playing list always starts at 0, not 1. This command is usually in Hex.
Onto the volume slide command: A. This is slightly more complex (much more if you're using a newer tracker, if you want to achieve the results here, then set slides to Amiga, not linear), due to the fact it depends on the secondary tempo. For now set a secondary tempo of 06 (you can play around later), load a long or looped sample and input a note or two. A few rows after a note type in the effect command A. For the parameters use 0F. Play back the pattern, and you should notice that when the effect kicks in, the sample drops to a very low volume very quickly. Change the effect parameters to F0, and use a low volume command on the note. Play back the pattern, and when the slide kicks in the volume of the note should increase very quickly.
This because each part of the effect parameters for command A does a different thing. The first number slides the volume up, and the second slides it down. It's not recommended that you use both a volume up and volume down at the same time, due to the fact the tracker only looks for the first number that isn't set to 0. If you specify parameters of 8F, the tracker will see the 8, ignore the F, and slide the volume up. Using a slide up and down at same time just makes you look stupid. Don't do it...
The Set Tempo command: F, is pretty easy to understand. You simply specify the BPM (in Hex) that you want to change to. One important thing to note is that values of lower than 20 (Hex) sets the secondary tempo rather than the primary.
Another useful command is the Pattern Break: D. This will stop the playing of the current pattern and skip to the next one in the playing list. By using parameters of more than 00 you can also specify which line to begin playing from.
Command 3 is Portamento to Note. This slides the currently playing note to another note, at a specified speed. The slide then stops when it reaches the desired note.
<pre>
C-2 1 000 - Starts the note playing
--- 000
C-3 330 - Starts the slide to C-3 at a speed of 30.
--- 300 - Continues the slide
--- 300 - Continues the slide
</pre>
Once the parameters have been set, the command can be input again without any parameters, and it'll still perform the same function unless you change the parameters. This memory function allows certain commands to function correctly, such as command 5, which is the Portamento to Note and Volume Slide command. Once command 3 has been set up command 5 will simply take the parameters from that and perform a Portamento to Note. Any parameters set up for command 5 itself simply perform a Volume Slide identical to command A at the same time as the Portamento to Note.
This memory function will only operate in the same channel where the original parameters were set up.
There are various other commands which perform two functions at once. They will be described as we come across them.
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 00
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 02
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 05
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 08
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 0A
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 0D
C-3 04 .. .. 09 10 ---> C-3 04 .. .. 09 10
(You can also switch on the Slider Rec to On, and perform parameter-live-recording, such as cutoff transitions, resonance or panning tweaking, etc..) Note: this command only works for volume/panning and fx datas columns.
The next command we'll look at is the Portamento up/down: 1 and 2. Command 1 slides the pitch up at a specified speed, and 2 slides it down. This command works in a similar way to the volume slide, in that it is dependent on the secondary tempo. Both these commands have a memory dependent on each other, if you set the slide to a speed of 3 with the 1 command, a 2 command with no parameters will use the speed of 3 from the 1 command, and vice versa.
Command 4 is Vibrato. Vibrato is basically rapid changes in pitch, just try it, and you'll see what I mean. Parameters are in the format of xy, where x is the speed of the slide, and y is the depth of the slide. One important point to remember is to keep your vibratos subtle and natural so a depth of 3 or less and a reasonably fast speed, around 8, is usually used. Setting the depth too high can make the part sound out of tune from the rest.
Following on from command 4 is command 6. This is the Vibrato and Volume Slide command, and it has a memory like command 5, which you already know how to use.
Command 7 is Tremolo. This is similar to vibrato. Rather than changing the pitch it slides the volume. The effect parameters are in exactly the same format. vibrato effect (0x1dxy) x = speed y = depth (can't be used if arpeggio (0x1b) is turned on)
<pre>
C-7 00 .. .. 1B37 <- Turn Arpeggio effect on
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 1B38 <- Change datas
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 1B00 <- Turn it off
</pre>
Command 9 is Sample Offset. This starts the playback of the sample from a different place than the start. The effect parameters specify the sample offset, but only very roughly. Say you have a sample which is 8765(Hex) bytes long, and you wanted it to play from position 4321(Hex). The effect parameter could only be as accurate as the 43 part, and it would ignore the 21.
Command B is the Playing List/Order Jump command. The parameters specify the position in the Playing List/Order to jump to. When used in conjunction with command D you can specify the position and the line to play from.
Command E is pretty complex, as it is used for a lot of different things, depending on what the first parameter is. Let's take a trip through each effect in order.
Command E0 controls the hardware filter on an Amiga, which, as a low pass filter, cuts off the highest frequencies being played back. There are very few players and trackers on other system that simulate this function, not that you should need to use it. The second parameter, if set to 1, turns on the filter. If set to 0, the filter gets turned off.
Commands E1/E2 are Fine Portamento Up/Down. Exactly the same functions as commands 1/2, except that they only slide the pitch by a very small amount. These commands have a memory the same as 1/2 as well.
Command E3 sets the Glissando control. If parameters are set to 1 then when using command 3, any sliding will only use the notes in between the original note and the note being slid to. This produces a somewhat jumpier slide than usual. The best way to understand is to try it out for yourself. Produce a slow slide with command 3, listen to it, and then try using E31.
Command E4 is the Set Vibrato Waveform control. This command controls how the vibrato command slides the pitch. Parameters are 0 - Sine, 1 - Ramp Down (Saw), 2 - Square. By adding 4 to the parameters, the waveform will not be restarted when a new note is played e.g. 5 - Sine without restart.
Command E5 sets the Fine Tune of the instrument being played, but only for the particular note being played. It will override the default Fine Tune for the instrument. The parameters range from 0 to F, with 0 being -8 and F being +8 Fine Tune. A parameter of 8 gives no Fine Tune. If you're using a newer tracker that supports more than -8 to +8 e.g. -128 to +128, these parameters will give a rough Fine Tune, accurate to the nearest 16.
Command E6 is the Jump Loop command. You mark the beginning of the part of a pattern that you want to loop with E60, and then specify with E6x the end of the loop, where x is the number of times you want it to loop.
Command E7 is the Set Tremolo Waveform control. This has exactly the same parameters as command E4, except that it works for Tremolo rather than Vibrato.
Command E9 is for Retriggering the note quickly. The parameter specifies the interval between the retrigs. Use a value of less than the current secondary tempo, or else the note will not get retrigged.
Command EA/B are for Fine Volume Slide Up/Down. Much the same as the normal Volume Slides, except that these are easier to control since they don't depend on the secondary tempo. The parameters specify the amount to slide by e.g. if you have a sample playing at a volume of 08 (Hex) then the effect EA1 will slide this volume to 09 (Hex). A subsequent effect of EB4 would slide this volume down to 05 (Hex).
Command EC is the Note Cut. This sets the volume of the currently playing note to 0 at a specified tick. The parameters should be lower than the secondary tempo or else the effect won't work.
Command ED is the Note Delay. This should be used at the same time as a note is to be played, and the parameters will specify the number of ticks to delay playing the note. Again, keep the parameters lower than the secondary tempo, or the note won't get played!
Command EE is the Pattern Delay. This delays the pattern for the amount of time it would take to play a certain number of rows. The parameters specify how many rows to delay for.
Command EF is the Funk Repeat command. Set the sample loop to 0-1000. When EFx is used, the loop will be moved to 1000- 2000, then to 2000-3000 etc. After 9000-10000 the loop is set back to 0- 1000. The speed of the loop "movement" is defined by x. E is two times as slow as F, D is three times as slow as F etc. EF0 will turn the Funk Repeat off and reset the loop (to 0-1000).
effects 0x41 and 0x42 to control the volumes of the 2 303 units
There is a dedicated panel for synth parameter editing with coherent sections (osc, filter modulation, routing, so on) the interface is much nicer, much better to navigate with customizable colors, the reverb is now customizable (10 delay lines), It accepts newer types of Waves (higher bit rates, at least 24). Has a replay routine.
It's pretty much your basic VA synth. The problem isn't with the sampler being to high it's the synth is tuned two octaves too low, but if you want your samples tuned down just set the base note down 2 octaves (in the instrument panel).
so the synth is basically divided into 3 sections from left to right: oscillators/envelopes, then filter and LFO's, and in the right column you have mod routings and global settings.
for the oscillator section you have two normal oscillators (sine, saw, square, noise), the second of which is tunable, the first one tunes with the key pressed. Attached to OSC 1 is a sub-oscillator, which is a sawtooth wave tuned one octave down. The phase modulation controls the point in the duty cycle at which the oscillator starts. The ADSR envelope sliders (grouped with oscs) are for modulation envelope 1 and 2 respectively. you can use the synth as a sampler by choosing the instrument at the top.
In the filter column, the filter settings are: 1 = lowpass, 2 = highpass, 3 = off. cutoff and resonance. For the LFOs they are LFO 1 and LFO 2, the ADSR sliders in those are for the LFO itself.
For the modulation routings you have ENV 1, LFO 1 for the first slider and ENV 2, LFO 2 for the second, you can cycle through the individual routings there, and you can route each modulation source to multiple destinations of course, which is another big plus for this synth. Finally the glide time is for portamento and master volume, well, the master volume... it can go quite loud.
The sequencer is changed too, It's more like the one in AXS if you've used that, where you can mute tracks to re-use patterns with variation.
<pre>
Support for the following modules formats:
669 (Composer 669, Unis 669),
AMF (DSMI Advanced Module Format),
AMF (ASYLUM Music Format V1.0),
APUN (APlayer), DSM (DSIK internal format),
FAR (Farandole Composer),
GDM (General DigiMusic),
IT (Impulse Tracker),
IMF (Imago Orpheus),
MOD (15 and 31 instruments),
MED (OctaMED),
MTM (MultiTracker Module editor),
OKT (Amiga Oktalyzer),
S3M (Scream Tracker 3),
STM (Scream Tracker),
STX (Scream Tracker Music Interface Kit),
ULT (UltraTracker),
UNI (MikMod),
XM (FastTracker 2),
Mid (midi format via timidity)
</pre>
Possible plugin options include [http://lv2plug.in/ LV2],
====Midi - Musical Instrument Digital Interface====
A midi file typically contains music that plays on up to 16 channels (as per the midi standard), but many notes can simultaneously play on each channel (depending on the limit of the midi hardware playing it).
'''Timidity'''
Although usually already installed, you can uncompress the [http://www.libsdl.org/projects/SDL_mixer/ timidity.tar.gz (14MB)] into a suitable drawer like below's SYS:Extras/Audio/
assign timidity: SYS:Extras/Audio/timidity
added to SYSːs/User-Startup
'''WildMidi playback'''
'''Audio Evolution 4 (2003) 4.0.23 (from 2012)'''
*Sync Menu - CAMD Receive, Send checked
*Options Menu - MIDI Machine Control - Midi Bar Display - Select CAMD MIDI in / out - Midi Remote Setup
MCB Master Control Bus
*Sending a MIDI start-command and a Song Position Pointer, you can synchronize audio with an external MIDI sequencer (like B&P).
*B&P Receive, start AE, add AudioEvolution.ptool in Bars&Pipes track, press play / record in AE then press play in Pipes
*CAMD Receive, receive MIDI start or continue commands via camd.library sync to AE
*MIDI Machine Control
*Midi Bar Display
*Select CAMD MIDI in / out
*Midi Remote Setup - open requester for external MIDI controllers to control app mixer and transport controls cc remotely
Channel - mixer(vol, pan, mute, solo), eq, aux, fx,
Subgroup - Volume, Mute, Solo
Transport - Start, End, Play, Stop, Record, Rewind, Forward
Misc - Master vol., Bank Down, Bank up
<pre>
q - quit
First 3 already opened when AE started
F1 - timeline window
F2 - mixer
F3 - control
F4 - subgroups
F5 - aux returns
F6 - sample list
i - Load sample to use
space - start/stop play
b - reset time 0:00
s - split mode
r - open recording window
a - automation edit mode with p panning, m mute and v volume
[ / ] - zoom in / out
: - previous track
* - next track
x c v f - cut copy paste cross-fade
g - snap grid
</pre>
'''[http://bnp.hansfaust.de/ Bars n Pipes sequencer]'''
BarsnPipes debug ... in shell
Menu (right mouse)
*Song - Songs load and save in .song format but option here to load/save Midi_Files .mid in FORMAT0 or FORMAT1
*Track -
*Edit -
*Tool -
*Timing - SMTPE Synchronizing
*Windows -
*Preferences - Multiple MIDI-in option
Windows (some of these are usually already opened when Bars n Pipes starts up for the first time)
*Workflow -> Tracks, .... Song Construction, Time-line Scoring, Media Madness, Mix Maestro,
*Control -> Transport (or mini one), Windows (which collects all the Windows icons together-shortcut), .... Toolbox, Accessories, Metronome,
Once you have your windows placed on the screen that suits your workflow, Song -> Save as Default will save the positions, colors, icons, etc as you'd like them
If you need a particular setup of Tracks, Tools, Tempos etc, you save them all as a new song you can load each time
Right mouse menu -> Preferences -> Environment... -> ScreenMode - Linkages for Synch (to Slave) usbmidi.out.0 and Send (Master) usbmidi.in.0 - Clock MTC
'''Tracks'''
#Double-click on B&P's icon. B&P will then open with an empty Song. You can also double-click on a song icon to open a song in B&P.
#Choose a track. The B&P screen will contain a Tracks Window with a number of tracks shown as pipelines (Track 1, Track 2, etc...). To choose a track, simply click on the gray box to show an arrow-icon to highlight it. This icon show whether a track is chosen or not. To the right of the arrow-icon, you can see the icon for the midi-input. If you double-click on this icon you can change the MIDI-in setup.
#Choose Record for the track. To the right of the MIDI-input channel icon you can see a pipe. This leads to another clickable icon with that shows either P, R or M. This stands for Play, Record or Merge. To change the icon, simply click on it. If you choose P, this track can only play the track (you can't record anything). If you choose R, you can record what you play and it overwrites old stuff in the track. If you choose M, you merge new records with old stuff in the track. Choose R now to be able to make a record.
#Chose MIDI-channel. On the most right part of the track you can see an icon with a number in it. This is the MIDI-channel selector. Here you must choose a MIDI-channel that is available on your synthesizer/keyboard. If you choose General MIDI channel 10, most synthesizer will play drum sounds. To the left of this icon is the MIDI-output icon. Double-click on this icon to change the MIDI-output configuration.
#Start recording. The next step is to start recording. You must then find the control buttons (they look like buttons on a CD-player). To be able to make a record. you must click on the R icon. You can simply now press the play button (after you have pressed the R button) and play something on you keyboard. To playback your composition, press the Play button on the control panel.
#Edit track. To edit a track, you simply double click in the middle part of a track. You will then get a new window containing the track, where you can change what you have recorded using tools provided. Take also a look in the drop-down menus for more features.
Videos to help understand [https://www.youtube.com/watch?v=A6gVTX-9900 small intro], [https://www.youtube.com/watch?v=abq_rUTiSA4&t=3s Overview], [https://www.youtube.com/watch?v=ixOVutKsYQo Workplace Setup CC PC Sysex], [https://www.youtube.com/watch?v=dDnJLYPaZTs Import Song], [https://www.youtube.com/watch?v=BC3kkzPLkv4 Tempo Mapping], [https://www.youtube.com/watch?v=sd23kqMYPDs ptool Arpeggi-8], [https://www.youtube.com/watch?v=LDJq-YxgwQg PlayMidi Song], [https://www.youtube.com/watch?v=DY9Pu5P9TaU Amiga Midi], [https://www.youtube.com/watch?v=abq_rUTiSA4 Learning Amiga bars and Pipes],
Groups like [https://groups.io/g/barsnpipes/topics this] could help
'''Tracks window'''
* blue "1 2 3 4 5 6 7 8 Group" and transport tape deck VCR-type controls
* Flags
* [http://theproblem.alco-rhythm.com/org/bp.html Track 1, Track2, to Track 16, on each Track there are many options that can be activated]
Each Track has a
*Left LHS - Click in grey box to select what Track to work on, Midi-In ptool icon should be here (5pin plug icon), and many more from the Toolbox on the Input Pipeline
*Middle - (P, R, M) Play, Record, Merge/Multi before the sequencer line and a blue/red/yellow (Thru Mute Play) Tap
*Right RHS - Output pipeline, can have icons placed uopn it with the final ptool icon(s) being the 5pin icon symbol for Midi-OUT
Clogged pipelines may need Esc pressed several times
'''Toolbox (tools affect the chosen pipeline)'''
After opening the Toolbox window you can add extra Tools (.ptool) for the pipelines like keyboard(virtual), midimonitor, quick patch, transpose, triad, (un)quantize, feedback in/out, velocity etc
right mouse -> Toolbox menu option -> Install Tool... and navigate to Tool drawer (folder) and select requried .ptool
Accompany B tool to get some sort of rythmic accompaniment, Rythm Section and Groove Quantize are examples of other tools that make use of rythms
[https://aminet.net/search?query=bars Bars & Pipes pattern format .ptrn] for drawer (folder). Load from the Menu as Track or Group
'''Accessories (affect the whole app)'''
Accessories -> Install... and goto the Accessories drawer for .paccess like adding ARexx scripting support
'''Song Construction'''
<pre>
F1 Pencil
F2 Magic Wand
F3 Hand
F4 Duplicator
F5 Eraser
F6 Toolpad
F7 Bounding box
F8 Lock to A-B-A
A-B-A strip, section, edit flags, white boxes,
</pre>
Bars&Pipes Professional offers three track formats; basic song tracks, linear tracks — which don't loop — and finally real‑time tracks. The difference between them is that both song and linear tracks respond to tempo changes, while real‑time tracks use absolute timing, always trigger at the same instant regardless of tempo alterations
'''Tempo Map'''
F1 Pencil
F2 Magic Wand
F3 Hand
F4 Eraser
F5 Curve
F6 Toolpad
Compositions
Lyrics, Key, Rhythm, Time Signature
'''Master Parameters'''
Key, Scale/Mode
'''Track Parameters'''
Dynamics
'''Time-line Scoring'''
'''Media Madness'''
'''Mix Maestro'''
*ACCESSORIES Allows the importation of other packages and additional modules
*CLIPBOARD Full cut, copy and paste operations, enabling user‑definable clips to be shared between tracks.
*INFORMATION A complete rundown on the state of the current production and your machine.
*MASTER PARAMETERS Enables global definition of time signatures, lyrics, scales, chords, dynamics and rhythm changes.
*MEDIA MADNESS A complete multimedia sequencer which allows samples, stills, animation, etc
*METRONOME Tempo feedback via MIDI, internal Amiga audio and colour cycling — all three can be mixed and matched as required.
*MIX MAESTRO Completely automated mixdown with control for both volume and pan. All fader alterations are memorised by the software
*RECORD ACTIVATION Complete specification of the data to be recorded/merged. Allows overdubbing of pitch‑bend, program changes, modulation etc
*SET FLAGS Numeric positioning of location and edit flags in either SMPTE or musical time
*SONG CONSTRUCTION Large‑scale cut and paste of individual measures, verses or chorus, by means of bounding box and drag‑n‑drop mouse selections
*TEMPO MAP Tempo change using a variety of linear and non‑linear transition curves
*TEMPO PALETTE Instant tempo changes courtesy of four user‑definable settings.
*TIMELINE SCORING Sequencing of a selection of songs over a defined period — ideal for planning an entire set for a live performance.
*TOOLBOX Selection screen for the hundreds of signal‑processing tools available
*TRACKS Opens the main track window to enable recording, editing and the use of tools.
*TRANSPORT Main playback control window, which also provides access to user‑ defined flags, loop and punch‑in record modes.
Bars and Pipes Pro 2.5 is using internal 4-Byte IDs, to check which kind of data are currently processed.
Especially in all its files the IDs play an important role. The IDs are stored into the file in the same order they are laid out in the memory.
In a Bars 'N' Pipes file (no matter which kind) the ID "NAME" (saved as its ANSI-values) is stored on a big endian system (68k-computer) as "NAME". On a little endian system (x86 PC computer) as "EMAN". The target is to make the AROS-BnP compatible to songs, which were stored on a 68k computer (AMIGA).
If possible, setting MIDI channels for Local Control for your keyboard
http://www.fromwithin.com/liquidmidi/archive.shtml
MIDI files are essentially a stream of event data. An event can be many things, but typically "note on", "note off", "program change", "controller change", or messages that instruct a MIDI compatible synth how to play a given bit of music.
* Channel - 1 to 16 -
* Messages - PC presets, CC effects like delays, reverbs, etc
* Sequencing - MIDI instruments, Drums, Sound design,
* Recording -
* GUI - Piano roll or Tracker, Staves and Notes
MIDI events/messages like step entry e.g. Note On, Note Off
MIDI events/messages like PB, PC, CC, Mono and Poly After-Touch, Sysex, etc
MIDI sync - Midi Clocks (SPS Measures), Midi Time Code (h, m, s and frames) SMPTE
Individual track editing with audition edits so easier to test any changes. Possible to stop track playback, mix clips from the right edit flag and scroll the display using arrow keys.
Step entry, to extend a selected note hit the space bar and the note grows accordingly. Ability to cancel mouse‑driven edits by simply clicking the right mouse button — at which point everything snaps back into its original form. Lyrics can now be put in with syllable dividers, even across an entire measure or section. Autoranging when you open a edit window, the notes are automatically displayed — working from the lowest upwards.
Flag editing, shift‑click on a flag immediately open the bounds window, ready for numeric input. Ability to cancel edits using the right‑hand mouse button, plus much improved Bounding Box operations.
Icons other than the BarsnPipes icon -> PUBSCREEN=BarsnPipes (cannot choose modes higher than 8bit 256 colors)
Preferences -> Menu in Tracks window - Send MIDI defaults OFF
Prefs -> Environment -> screenmode (saved to BarsnPipes.prefs binary file)
Customization -> pics in gui drawer (folder) -
Can save as .song files and .mid General Midi
SMF is a “Standard Midi File” ([http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html SMF0, SMF1 and SMF2]), [https://github.com/stump/libsmf libsmf], [https://github.com/markc/midicomp MIDIcomp], [https://github.com/MajicDesigns/MD_MIDIFile C++ src], [], [https://github.com/newdigate/midi-smf-reader Midi player],
* SMF0 All MIDI data is stored in one track only, separated exclusively by the MIDI channel.
* SMF1 The MIDI data is stored in separate tracks/channels.
* SMF2 (rarely used) The MIDI data is stored in separate tracks, which are additionally wrapped in containers, so it's possible to have e.g. several tracks using the same MIDI channels.
Would it be possible to enrich Bars N’Pipes with software synth and sample support along with audio recording and mastering tools like in the named MAC or PC music sequencers?
On the classic AMIGA-OS this is not possible because of missing CPU-power. The hardware of the classic AMIGA is not further developed. So we must say (unfortunately) that those dreams can’t become reality
BarsnPipes is best used with external MIDI-equipment. This can be a keyboard or synthesizer with MIDI-connectors.
<pre>
MIDI can control 16 channels
There are USB-MIDI-Interfaces on the market with 16 independent MIDI-lines (multi-port), which can handle 16 MIDI devices independently – 16×16 = 256 independent MIDI-channels or instruments
handle up to 16 different USB-MIDI-Interfaces (multi-device). That is: 16X16X16 = 4096 independent MIDI-channels – theoretically
</pre>
<pre>
Librarian MIDI SYStem EXplorer (sysex) - PatchEditor and used to be supplied as a separate program like PatchMeister but currently not at present
It should support MIDI.library (PD), BlueRibbon.library (B&P), TriplePlayPlus, and CAMD.library (DeluxeMusic) and
MIDI information from a device's user manual and configure a custom interface to access parameters for all MIDI products connected to the system
Supports ALL MIDI events and the Patch/Librarian data is stored in MIDI standard format
Annette M.Crowling, Missing Link Software, Inc.
</pre>
Composers
<pre>
[https://x.com/hirasawa/status/1403686519899054086 Susumu Hirasawa]
</pre>
<pre>
1988 Todor Fay and his wife Melissa Jordan Gray, who founded the Blue Ribbon Inc
1992 Bars&Pipes Pro published
November 2000, Todor Fay announcement to release the sourcecode of Bars&Pipes Pro 2.5c beta
end of May 2001, the source of the main program and the sources of some tools and accessories were in a complete and compileable state
end of October 2009 stop further development of BarsnPipes New for now on all supported systems and made freeware
2013 Alfred Faust diagnosed with incureable illness, called „Myastenia gravis“ (weak muscles)
</pre>
Protrekkr
How to use Midi In/Out in Protrekkr ?
First of all, midi in & out capabilities of this program are rather limited.
# Go to Misc. Setup section and select a midi in or out device to use (ptk only supports one device at a time).
# Go to instrument section, and select a MIDI PRG (the default is N/A, which means no midi program selected).
# Go to track section and here you can assign a midi channel to each track of ptk.
# Play notes :]. Note off works. F'x' note cut command also works too, and note-volume command (speed) is supported.
Also, you can change midicontrollers in the tracker, using '90' in the panning row:
<pre>
C-3 02 .. .. 0000....
--- .. .. 90 xxyy.... << This will set the value
--- .. .. .. 0000.... of the controller n.'xx' to 'yy' (both in hex)
--- .. .. .. 0000....
</pre>
So "--- .. .. 90 2040...." will set the controller number $20(32) to $40(64).
You will need the midi implementation table of your gear to know what you can change with midi controller messages.
N.B. Not all MIDI devices are created equal!
Although the MIDI specification defines a large range of MIDI messages of various kinds, not every MIDI device is required to work in exactly the same way and respond to all the available messages and ways of working. For example, we don't expect a wind synthesiser to work in the same way as a home keyboard.
Some devices, the older ones perhaps, are only able to respond to a single channel. With some of those devices that channel can be altered from the default of 1 (probably) to another channel of the 16 possible.
Other devices, for instance monophonic synthesisers, are capable of producing just one note at a time, on one MIDI channel. Others can produce many notes spread across many channels.
Further devices can respond to, and transmit, "breath controller" data (MIDI controller number 2 (CC#2)) others may respond to the reception of CC#2 but not be able to create and to send it.
A controller keyboard may be capable of sending "expression pedal" data, but another device may not be capable of responding to that message.
Some devices just have the basic GM sound set. The "voice" or "instrument" is selected using a "Program Change" message on its own.
Other devices have a greater selection of voices, usually arranged in "banks", and the choice of instrument is made by responding to "Bank Select MSB" (MIDI controller 0 (CC#0)), others use "Bank Select LSB" (MIDI controller number 32 (CC#32)), yet others use both MSB and LSB sent one after the other, all followed by the Program Change message. The detailed information about all the different voices will usually be available in a published MIDI Data List.
MIDI Implementation Chart
But in the User Manual there is sometimes a summary of how the device works, in terms of MIDI, in the chart at the back of the manual, the MIDI Implementation Chart.
If you require two devices to work together you can compare the two implementation charts to see if they are "compatible". In order to do this we will need to interpret that chart.
The chart is divided into four columns headed "Function", "Transmitted" (or "Tx"), "Received" (or "Rx"), or more correctly "Recognised", and finally, "Remarks".
<pre>
The left hand column defines which MIDI functions are being described.
The 2nd column defines what the device in question is capable of transmitting to another device.
The 3rd column defines what the device is capable of responding to.
The 4th column is for explanations of the values contained within these previous two columns.
</pre>
There should then be twelve sections, with possibly a thirteenth containing extra "Notes". Finally there should be an explanation of the four MIDI "modes" and what the "X" and the "O" mean.
<pre>
Mode 1: Omni On, Poly;
Mode 2: Omni On, Mono;
Mode 3: Omni Off, Poly;
Mode 4: Omni Off, Mono.
</pre>
O means "yes" (implemented), X means "no" (not implemented).
Sometimes you will find a row of asterisks "**************", these seem to indicate that the data is not applicable in this case. Seen in the transmitted field only (unless you've seen otherwise).
Lastly you may find against some entries an asterisk followed by a number e.g. *1, these will refer you to further information, often on a following page, giving more detail.
Basic Channel
But the very first set of boxes will tell us the "Basic Channel(s)" that the device sends or receives on.
"Default" is what happens when the device is first turned on, "changed" is what a switch of some kind may allow the device to be set to.
For many devices e.g. a GM sound module or a home keyboard, this would be 1-16 for both. That is it can handle sending and receiving on all MIDI channels.
On other devices, for example a synthesiser, it may by default only work on channel 1. But the keyboard could be "split" with the lower notes e.g. on channel 2. If the synth has an arppegiator, this may be able to be set to transmit and or receive on yet another channel.
So we might see the default as "1" but the changed as "1-16".
Modes.
We need to understand Omni On and Off, and Mono and Poly, then we can decipher the four modes.
But first we need to understand that any of these four Mode messages can be sent to any MIDI channel. They don't necessarily apply to the whole device.
If we send an "Omni On" message (CC#125) to a MIDI channel of a device, we are, in effect, asking it to respond to e.g. a Note On / Off message pair, received on any of the sixteen channels. Sound strange? Read it again. Still strange? It certainly is. We normally want a MIDI channel to respond only to Note On / Off messages sent on that channel, not any other. In other words, "Omni Off".
So "Omni Off" (CC#124) tells a channel of our MIDI device to respond only to messages sent on that MIDI channel.
"Poly" (CC#127) is for e.g. a channel of a polyphonic sound module, or a home keyboard, to be able to respond to many simultaneous Note On / Off message pairs at once and produce musical chords.
"Mono" (CC#126) allows us to set a channel to respond as if it were e.g. a flute or a trumpet, playing just one note at a time. If the device is capable of it, then the overlapping of notes will produce legato playing, that is the attack portion of the second note of two overlapping notes will be removed resulting in a "smoother" transition.
So a channel with a piano voice assigned to it will have Omni Off, Poly On (Mode 3), a channel with a saxophone voice assigned could be Omni Off, Mono On (Mode 4).
We call these combinations the four modes, 1 to 4, as defined above.
Most modern devices will have their channels set to Mode 3 (Omni Off, Poly) but be switchable, on a per channel basis, to Mode 4 (Omni Off, Mono).
This second section of data will include first its default value i.e. upon device switch on. Then what Mode messages are acceptable, or X if none.
Finally, in the "Altered" field, how a Mode message that can't be implemented will be interpreted. Usually there will just be a row of asterisks effectively meaning nothing will be done if you try to switch to an unimplemented mode.
Note Number
<pre>
The next row will tell us which MIDI notes the device can send or receive, normally 0-127.
The second line, "True Voice" has the following in the MIDI specification:
"Range of received note numbers falling within the range of true notes produced by the instrument."
My interpretation is that, for instance, a MIDI piano may be capable of sending all MIDI notes (0 to 127) by transposition, but only responding to the 88 notes (21 to 108) of a real piano.
</pre>
Velocity
This will tell us whether the device we're looking at will handle note velocity, and what range from 1-127, or maybe just 64, it transmits or will recognise. So usually "O" plus a range or "X" for not implemented.
After touch
This may have one or two lines two it.
If a one liner the either "O" or "X", yes or no.
If a two liner then it may include "Keys" or "Poly" and "Channel".
This will show whether the device will respond to Polyphonic after touch or channel after touch or neither.
Pitch Bend
Again "O" for implemented, "X" for not implemented.
(Many stage pianos will have no pitch bend capability.)
It may also, in the notes section, state whether it will respond to the full 14 bits, or not, as usually encoded by the pitch bend wheel.
Control Change
This is likely to be the largest section of the chart.
It will list all those controllers, starting from CC#0, Bank Select MSB, which the device is capable of sending, and those that it will respond to using "O" or "X" respectively.
You will, almost certainly, get some further explanation of functionality in the remarks column, or in more detail elsewhere in the documentation.
Of course you will need to know what all the various controller numbers do. Lots of the official technical specifications can be found at the [www.midi.org/techspecs/ MMA], with the table of messages and control change [www.midi.org/techspecs/midimessages.php message numbers]
Program Change
Again "O" or "X" in the Transmitted or Recognised column to indicate whether or not the feature is implemented. In addition a range of numbers is shown, typically 0-127, to show what is available.
True # (number): "The range of the program change numbers which correspond to the actual number of patches selected."
System Exclusive
Used to indicate whether or not the device can send or recognise System Exclusive messages. A short description is often given in the Remarks field followed by a detailed explanation elsewhere in the documentation.
System Common - These include the following:
<pre>
MIDI Time Code Quarter Frame messages (device synchronisation).
Song Position Pointer
Song Select
Tune Request
</pre>
The section will indicate whether or not the device can send or respond to any of these messages.
System Real Time
These include the following:
<pre>
Timing Clock - often just written as "Clock"
Start
Stop
Continue
</pre>
These three are usually just referred to as "Commands" and listed.
Again the section will indicate which, if any, of these messages the device can send or respond to.
<pre>
Aux. Messages
Again "O" or "X" for implemented or not.
Aux. = Auxiliary.
Active Sense = Active Sensing.
</pre>
Often with an explanation of the action of the device.
Notes
The "Notes" section can contain any additional comments to clarify the particular implementation.
Some of the explanations have been drawn directly from the MMA MIDI 1.0 Detailed Specification.
And the detailed explanation of some of the functions will be found there, or in the General MIDI System Level 1 or General MIDI System Level 2 documents also published by the MMA.
OFFICIAL MIDI SPECIFICATIONS
SUMMARY OF MIDI MESSAGES
Table 1 - Summary of MIDI Messages
The following table lists the major MIDI messages in numerical (binary) order (adapted from "MIDI by the Numbers" by D. Valenti, Electronic Musician 2/88, and updated by the MIDI Manufacturers Association.). This table is intended as an overview of MIDI, and is by no means complete.
WARNING! Details about implementing these messages can dramatically impact compatibility with other products. We strongly recommend consulting the official MIDI Specifications for additional information.
MIDI 1.0 Specification
Message Summary Channel Voice Messages [nnnn = 0-15 (MIDI Channel Number 1-16)]
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->1000nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Note Off event.
This message is sent when a note is released (ended). (kkkkkkk) is the key (note) number. (vvvvvvv) is the velocity.
|-
|<!--Status-->1001nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Note On event.
This message is sent when a note is depressed (start). (kkkkkkk) is the key (note) number. (vvvvvvv) is the velocity.
|-
|<!--Status-->1010nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Polyphonic Key Pressure (Aftertouch).
This message is most often sent by pressing down on the key after it "bottoms out". (kkkkkkk) is the key (note) number. (vvvvvvv) is the pressure value.
|-
|<!--Status-->1011nnnn || <!--Data-->0ccccccc 0vvvvvvv || <!--Description-->Control Change.
This message is sent when a controller value changes. Controllers include devices such as pedals and levers. Controller numbers 120-127 are reserved as "Channel Mode Messages" (below). (ccccccc) is the controller number (0-119). (vvvvvvv) is the controller value (0-127).
|-
|<!--Status-->1100nnnn || <!--Data-->0ppppppp || <!--Description-->Program Change. This message sent when the patch number changes. (ppppppp) is the new program number.
|-
|<!--Status-->1101nnnn || <!--Data-->0vvvvvvv || <!--Description-->Channel Pressure (After-touch). This message is most often sent by pressing down on the key after it "bottoms out". This message is different from polyphonic after-touch. Use this message to send the single greatest pressure value (of all the current depressed keys). (vvvvvvv) is the pressure value.
|-
|<!--Status-->1110nnnn || <!--Data-->0lllllll 0mmmmmmm || <!--Description-->Pitch Bend Change. This message is sent to indicate a change in the pitch bender (wheel or lever, typically). The pitch bender is measured by a fourteen bit value. Center (no pitch change) is 2000H. Sensitivity is a function of the receiver, but may be set using RPN 0. (lllllll) are the least significant 7 bits. (mmmmmmm) are the most significant 7 bits.
|}
Channel Mode Messages (See also Control Change, above)
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->1011nnnn || <!--Data-->0ccccccc 0vvvvvvv || <!--Description-->Channel Mode Messages.
This the same code as the Control Change (above), but implements Mode control and special message by using reserved controller numbers 120-127. The commands are:
*All Sound Off. When All Sound Off is received all oscillators will turn off, and their volume envelopes are set to zero as soon as possible c = 120, v = 0: All Sound Off
*Reset All Controllers. When Reset All Controllers is received, all controller values are reset to their default values. (See specific Recommended Practices for defaults) c = 121, v = x: Value must only be zero unless otherwise allowed in a specific Recommended Practice.
*Local Control. When Local Control is Off, all devices on a given channel will respond only to data received over MIDI. Played data, etc. will be ignored. Local Control On restores the functions of the normal controllers.
c = 122, v = 0: Local Control Off
c = 122, v = 127: Local Control On
* All Notes Off. When an All Notes Off is received, all oscillators will turn off.
c = 123, v = 0: All Notes Off (See text for description of actual mode commands.)
c = 124, v = 0: Omni Mode Off
c = 125, v = 0: Omni Mode On
c = 126, v = M: Mono Mode On (Poly Off) where M is the number of channels (Omni Off) or 0 (Omni On)
c = 127, v = 0: Poly Mode On (Mono Off) (Note: These four messages also cause All Notes Off)
|}
System Common Messages
System Messages (0xF0)
The final status nybble is a “catch all” for data that doesn’t fit the other statuses. They all use the most significant nybble (4bits) of 0xF, with the least significant nybble indicating the specific category.
The messages are denoted when the MSB of the second nybble is 1. When that bit is a 0, the messages fall into two other subcategories.
System Common
If the MSB of the second second nybble (4 bits) is not set, this indicates a System Common message. Most of these are messages that include some additional data bytes.
System Common Messages
Type Status Byte Number of Data Bytes Usage
<pre>
Time Code Quarter Frame 0xF1 1 Indicates timing using absolute time code, primarily for synthronization with video playback systems. A single location requires eight messages to send the location in an encoded hours:minutes:seconds:frames format*.
Song Position 0xF2 2 Instructs a sequencer to jump to a new position in the song. The data bytes form a 14-bit value that expresses the location as the number of sixteenth notes from the start of the song.
Song Select 0xF3 1 Instructs a sequencer to select a new song. The data byte indicates the song.
Undefined 0xF4 0
Undefined 0xF5 0
Tune Request 0xF6 0 Requests that the receiver retunes itself**.
</pre>
*MIDI Time Code (MTC) is significantly complex. Please see the MIDI Specification
**While modern digital instruments are good at staying in tune, older analog synthesizers were prone to tuning drift. Some analog synthesizers had an automatic tuning operation that could be initiated with this command.
System Exclusive
If you’ve been keeping track, you’ll notice there are two status bytes not yet defined: 0xf0 and 0xf7. These are used by the System Exclusive message, often abbreviated at SysEx. SysEx provides a path to send arbitrary data over a MIDI connection. There is a group of predefined messages for complex data, like fine grained control of MIDI Time code machinery. SysEx is also used to send manufacturer defined data, such as patches, or even firmware updates.
System Exclusive messages are longer than other MIDI messages, and can be any length. The messages are of the following format:
0xF0, 0xID, 0xdd, ...... 0xF7
The message is bookended with distinct bytes.
It opens with the Start Of Exclusive (SOX) data byte, 0xF0.
The next one to three bytes after the start are an identifier.
Values from 0x01 to 0x7C are one-byte vendor IDs, assigned to manufacturers who were involved with MIDI at the beginning.
If the ID is 0x00, it’s a three-byte vendor ID - the next two bytes of the message are the value.
<pre>
ID 0x7D is a placeholder for non-commercial entities.
ID 0x7E indicates a predefined Non-realtime SysEx message.
ID 0x7F indicates a predefined Realtime SysEx message.
</pre>
After the ID is the data payload, sent as a stream of bytes.
The transfer concludes with the End of Exclusive (EOX) byte, 0xF7.
The payload data must follow the guidelines for MIDI data bytes – the MSB must not be set, so only 7 bits per byte are actually usable. If the MSB is set, it falls into three possible scenarios.
An End of Exclusive byte marks the ordinary termination of the SysEx transfer.
System Real Time messages may occur within the transfer without interrupting it. The recipient should handle them independently of the SysEx transfer.
Other status bytes implicitly terminate the SysEx transfer and signal the start of new messages.
Some inexpensive USB-to-MIDI interfaces aren’t capable of handling messages longer than four bytes.
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->11110000 || <!--Data-->0iiiiiii [0iiiiiii 0iiiiiii] 0ddddddd --- --- 0ddddddd 11110111 || <!--Description-->System Exclusive.
This message type allows manufacturers to create their own messages (such as bulk dumps, patch parameters, and other non-spec data) and provides a mechanism for creating additional MIDI Specification messages. The Manufacturer's ID code (assigned by MMA or AMEI) is either 1 byte (0iiiiiii) or 3 bytes (0iiiiiii 0iiiiiii 0iiiiiii). Two of the 1 Byte IDs are reserved for extensions called Universal Exclusive Messages, which are not manufacturer-specific. If a device recognizes the ID code as its own (or as a supported Universal message) it will listen to the rest of the message (0ddddddd). Otherwise, the message will be ignored. (Note: Only Real-Time messages may be interleaved with a System Exclusive.)
|-
|<!--Status-->11110001 || <!--Data-->0nnndddd || <!--Description-->MIDI Time Code Quarter Frame.
nnn = Message Type
dddd = Values
|-
|<!--Status-->11110010 || <!--Data-->0lllllll 0mmmmmmm || <!--Description-->Song Position Pointer.
This is an internal 14 bit register that holds the number of MIDI beats (1 beat= six MIDI clocks) since the start of the song. l is the LSB, m the MSB.
|-
|<!--Status-->11110011 || <!--Data-->0sssssss || <!--Description-->Song Select.
The Song Select specifies which sequence or song is to be played.
|-
|<!--Status-->11110100 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11110101 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11110110 || <!--Data--> || <!--Description-->Tune Request. Upon receiving a Tune Request, all analog synthesizers should tune their oscillators.
|-
|<!--Status-->11110111 || <!--Data--> || <!--Description-->End of Exclusive. Used to terminate a System Exclusive dump.
|}
System Real-Time Messages
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->11111000 || <!--Data--> || <!--Description-->Timing Clock. Sent 24 times per quarter note when synchronization is required.
|-
|<!--Status-->11111001 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11111010 || <!--Data--> || <!--Description-->Start. Start the current sequence playing. (This message will be followed with Timing Clocks).
|-
|<!--Status-->11111011 || <!--Data--> || <!--Description-->Continue. Continue at the point the sequence was Stopped.
|-
|<!--Status-->11111100 || <!--Data--> || <!--Description-->Stop. Stop the current sequence.
|-
|<!--Status-->11111101 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11111110 || <!--Data--> || <!--Description-->Active Sensing. This message is intended to be sent repeatedly to tell the receiver that a connection is alive. Use of this message is optional. When initially received, the receiver will expect to receive another Active Sensing message each 300ms (max), and if it does not then it will assume that the connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non- active sensing) operation.
|-
|<!--Status-->11111111 || <!--Data--> || <!--Description-->Reset. Reset all receivers in the system to power-up status. This should be used sparingly, preferably under manual control. In particular, it should not be sent on power-up.
|}
Advanced Messages
Polyphonic Pressure (0xA0) and Channel Pressure (0xD0)
Some MIDI controllers include a feature known as Aftertouch. While a key is being held down, the player can press harder on the key. The controller measures this, and converts it into MIDI messages.
Aftertouch comes in two flavors, with two different status messages.
The first flavor is polyphonic aftertouch, where every key on the controller is capable of sending its own independent pressure information. The messages are of the following format:
<pre>
0xnc, 0xkk, 0xpp
n is the status (0xA)
c is the channel nybble
kk is the key number (0 to 127)
pp is the pressure value (0 to 127)
</pre>
Polyphonic aftertouch is an uncommon feature, usually found on premium quality instruments, because every key requires a separate pressure sensor, plus the circuitry to read them all.
Much more commonly found is channel aftertouch. Instead of needing a discrete sensor per key, it uses a single, larger sensor to measure pressure on all of the keys as a group. The messages omit the key number, leaving a two-byte format
<pre>
0xnc, 0xpp
n is the status (0xD)
c is the channel number
pp is the pressure value (0 to 127)
</pre>
Pitch Bend (0xE0)
Many keyboards have a wheel or lever towards the left of the keys for pitch bend control. This control is usually spring-loaded, so it snaps back to the center of its range when released. This allows for both upward and downward bends.
Pitch Bend Wheel
The wheel sends pitch bend messages, of the format
<pre>
0xnc, 0xLL, 0xMM
n is the status (0xE)
c is the channel number
LL is the 7 least-significant bits of the value
MM is the 7 most-significant bits of the value
</pre>
You’ll notice that the bender data is actually 14 bits long, transmitted as two 7-bit data bytes. This means that the recipient needs to reassemble those bytes using binary manipulation. 14 bits results in an overall range of 214, or 0 to 16,383. Because it defaults to the center of the range, the default value for the bender is halfway through that range, at 8192 (0x2000).
Control Change (0xB0)
In addition to pitch bend, MIDI has provisions for a wider range of expressive controls, sometimes known as continuous controllers, often abbreviated CC. These are transmitted by the remaining knobs and sliders on the keyboard controller shown below.
Continuous Controllers
These controls send the following message format:
<pre>
0xnc, 0xcc, 0xvv
n is the status (0xB)
c is the MIDI channel
cc is the controller number (0-127)
vv is the controller value (0-127)
</pre>
Typically, the wheel next to the bender sends controller number one, assigned to modulation (or vibrato) depth. It is implemented by most instruments.
The remaining controller number assignments are another point of confusion. The MIDI specification was revised in version 2.0 to assign uses for many of the controllers. However, this implementation is not universal, and there are ranges of unassigned controllers.
On many modern MIDI devices, the controllers are assignable. On the controller keyboard shown in the photos, the various controls can be configured to transmit different controller numbers. Controller numbers can be mapped to particular parameters. Virtual synthesizers frequently allow the user to assign CCs to the on-screen controls. This is very flexible, but it might require configuration on both ends of the link and completely bypasses the assignments in the standard.
Program Change (0xC0)
Most synthesizers have patch storage memory, and can be told to change patches using the following command:
<pre>
0xnc, 0xpp
n is the status (0xc)
c is the channel
pp is the patch number (0-127)
</pre>
This allows for 128 sounds to be selected, but modern instruments contain many more than 128 patches. Controller #0 is used as an additional layer of addressing, interpreted as a “bank select” command. Selecting a sound on such an instrument might involve two messages: a bank select controller message, then a program change.
Audio & Midi are not synchronized, what I can do ?
Buy a commercial software package but there is a nasty trick to synchronize both. It's a bit hardcore but works for me:
Simply put one line down to all midi notes on your pattern (use Insert key)
and go to 'Misc. Setup', adjust the latency and just search a value
that will make sound sync both audio/midi.
The stock Sin/Saw/Pulse and Rnd waveforms are too simple/common, is there a way to use something more complex/rich ?
You have to ability to redirect the waveforms of the instruments through the synth pipe by selecting the "wav" option for the oscillator you're using for this synth instrument, samples can be used as wavetables to replace the stock signals.
Sound banks like soundfont (sf2) or Kontakt2 are not supported at the moment
====DAW Audio Evolution 4====
Audio Evolution 4 gives you unsurpassed power for digital audio recording and editing on the Amiga. The latest release focusses on time-saving non-linear and non-destructive editing, as seen on other platforms. Besides editing, Audio Evolution 4 offers a wide range of realtime effects, including compression, noise gate, delays, reverb, chorus and 3-band EQ.
Whether you put them as inserts on a channel or use them as auxillaries, the effect parameters are realtime adjustable and can be fully automated. Together with all other mixing parameters, they can even be controlled remotely, using more ergonomic MIDI hardware.
Non-linear editing on the time line, including cut, copy, paste, move, split, trim and crossfade actions
The number of tracks per project(s) is unlimited .... AHI limits you to recording only two at a time. i.e. not on 8 track sound cards like the Juli@ or Phase 88.
sample file import is limited to 16bit AIFF (not AIFC, important distinction as some files from other sources can be AIFC with aiff file extention). and 16bit WAV (pcm only)
Most apps use the Music Unit only but a few apps also use Unit (0-3) instead or as well.
* Set up AHI prefs so that microphone is available. (Input option near the bottom)
stereo++ allows the audio piece to be placed anywhere and the left-right adjusted to sound positionally right
hifi best for music playback if driver supports this option
Load 16bit .aif .aiff only sample(s) to use not AIFC which can have the same ending. AIFF stands for Audio Interchange File Format
sox recital.wav recital.aiff
sox recital.wav −b 16 recital.aiff channels 1 rate 16k fade 3 norm
sox input.wav output.aiff bass −b 16 rate 48k
performs the same format translation, but also applies four effects (down-mix to one channel, sample rate change, fade-in, nomalize), and stores the result at a bit-depth of 16.
rec −c 2 radio.aiff trim 0 30:00
records half an hour of stereo audio
play existing-file.wav
24bit PCM WAV or AIFF do not work
*No stream format handling. So no way to pass on an AC3 encoded stream unmodified to the digital outputs through AHI.
*No master volume handling. Each application has to set its own volume. So each driver implements its own custom driver-mixer interface for handling master volumes, mute and preamps.
*Only one output stream. So all input gets mixed into one output.
*No automatic handling of output direction based on connected cables.
*No monitor input selection. Only monitor volume control.
select the correct input (Don't mistake enabled sound for the correct input.)
The monitor will feedback audio to the lineout and hp out no matter if you have selected the correct input to the ADC. The monitor will provide sound for any valid input. This will result in free mixing when recording from the monitor input instead of mic/line because the monitor itself will provide the hardware mixing for you. Be aware that MIC inputs will give two channel mono. Only Linein will give real stereo.
Now for the not working part. Attempt to record from linein in the AE4 record window, the right channel is noise and the left channel is distorted. Even with the recommended HIFI 16bit Stereo++ mode at 48kHz.
Channels
Monitor
Gain
Inout
Output
Advanced settings - Debugging via serial port
* Options -> Soundcard In/Out
* Options -> SampleRate
* Options -> Preferences
F6 for Sample File List
Setting a grid is easy as is measuring the BPM by marking a section of the sample. Is your kick drum track "not in time" ? If so, you're stumped in AE4 as it has no fancy variable time signatures and definitely no 'track this dodgy rhythm' function like software of the nature of Logic has. So if your drum beat is freeform you will need to work in freeform mode. (Real music is free form anyway).
If the drum *is* accurate and you are just having trouble measuring the time, I usually measure over a range of bars and set the number of beats in range to say 16 as this is more accurate, Then you will need to shift the drum track to match your grid *before* applying the grid. (probably an iterative process as when the grid is active samples snap to it, and when inactive you cannot see it).
AE4 does have ARexx but the functions are more for adding samples at set offsets and starting playback / recording.
These are the usual features found in DAWs...
* Recording digital audio, midi sequencer and mixer
* virtual VST instruments and plug-ins
* automation, group channels, MIDI channels, FX sends and returns, audio and MIDI editors and music notation editor
* different track views
* mixer and track layout (but not the same as below)
* traditional two windows (track and mixer)
Mixing - mixdown
Could not figure out how to select what part I wanted to send to the aux, set it to echo and return. Pretty much the whole echo effect. Or any effect.
Take look at page17 of the manual.
When you open the EQ / Aux send popup window you will see 4 sends. Now from the menu choose the windows menu.
Menus->Windows-> Aux Returns Window
or press F5
You will see a small window with 4 volume controls and an effects button for each. Click a button and add an effects to that aux channel, then set it up as desired (note the reverb effect has a special AUX setting that improves its use with the aux channel, not compulsory but highly useful). You set the amount of 'return' on the main mix in the Aux Return window, and the amount sent from each main mixer channel in the popup for that channel. Again the aux sends are "prefade" so the volume faders on each channel do not affect them.
Tracking
Effects - fade in
To add some echoes to some vocals, tried to add an effect on a track but did not come out. This is made more complicated as I wanted to mute a vocal but then make it echo at the muting point. Want to have one word of a vocal heard and then echoed off. But when the track is mute the echo is cancelled out.
To correctly understand what is happening here you need to study the figure at the bottom of page 15 on the manual. You will see from that that the effects are applied 'prefade' So the automation you applied will naturally mute the entire signal.
There would be a number of ways to achieve the goal,
You have three real time effects slots, one for smoothing like so
Sample -> Amplify -> Delay
Then automate the gain of the amplify block so that it effectively mutes the sample just before the delay at the appropriate moment, the echo effect should then be heard.
Getting the effects in the right order will require experimentation as they can only be added top down and it's not obvious which order they are applied to the signal, but there only two possibilities, so it wont take long to find out.
Using MUTE can cause clicks to the Amplify can be used to mute more smoothly so that's a secondary advantage.
Signal Processing -
Overdub
[[#top|...to the top]]
===Office===
====Spreadsheet Leu====
Support for some xlsx, and ods functions
====Spreadsheet Ignition====
; Needs ABIv1 to be completed before more can be done
File formats supported
* ascii #?.txt and #?.csv (single sheets with data only).
* igs and TurboCalc(WIP) #?.tc for all sheets with data, formats and formulas.
There is '''no''' support for xls, xlsx, ods or uos ([http://en.wikipedia.org/wiki/Uniform_Office_Format Uniform Unified Office Format]) at the moment.
* Always use Esc key after editing Spreadsheet cells.
* copy/paste seems to copy the first instance only so go to Edit -> Clipboard to manage the list of remembered actions.
* Right mouse click on row (1 or 2 or 3) or column header (a or b or c) to access optimal height or width of the row or column respectively
* Edit -> Insert -> Row seems to clear the spreadsheet or clears the rows after the inserted row until undo restores as it should be...
Change Sheet name by Object -> Sheet -> Properties
Click in the cell which will contain the result, and click '''down arrow button''' to the right of the formula box at the bottom of the spreadsheet and choose the function required from the list provided. Then click on the start cell and click on the bottom right corner, a '''very''' small blob, which allows stretching a bounding box (thick grey outlines) across many cells This grey bounding box can be used to '''copy a formula''' to other cells.
Object -> Cell -> Properties to change cell format - Currency only covers DM and not $, Euro, Renminbi, Yen or Pound etc.
Shift key and arrow keys selects a range of cells, so that '''formatting can be done to all highlighted cells'''.
View -> Overview then select ALL with one click (in empty cell in the top left hand corner of the sheet).
Default mode is relative cell referencing e.g. a1+a2 but absolute e.g. $a$1+$a$2 can be entered.
* #sheet-name to '''absolute''' reference another sheet-name cell unless reference() function used.
;Graphs
use shift key and arrow keys to select a bunch of cells to be graph'ed making sure that x axes represents and y axes represents
* value() - 0 value, 1 percent, 2 date, 3 time, 4 unit ...
;Dates
* Excel starts a running count from the 1st Jan 1900 and Ignition starts from 1st Jan 1AD '''(maybe this needs to change)'''
Set formatting Object -> Cell -> Properties and put date in days
;Time
Set formatting Object -> Cell -> Properties and put time in seconds taken
;Database (to be done by someone else)
type - standard, reference (bezug), search criterion (suchkriterium),
* select a bunch of cells and Object -> Database -> Define to set Datenbank (database) and Felder (fields not sure how?)
* Neu (new) or loschen (delete) to add/remove database headings e.g. Personal, Start Date, Finish Date (one per row?)
* Object -> Database -> Index to add fields (felder) like Surname, First Name, Employee ID, etc. to ?
Filtering done with dbfilter(), dbproduct() and dbposition().
Activities with dbsum(), dbaverage(), dbmin() and dbmax().
Table sorting -
;Scripts (Arexx)
;Excel(TM) to Ignition - commas ''',''' replaced by semi-colons ''';''' to separate values within functions
*SUM(),
*AVERAGE(), MAX(), MIN(), INT(), PRODUCT(), MEDIAN(), VAR() becomes Variance(), Percentile(),
*IF(), AND, OR, NOT
*LEFT(), RIGHT(), MID() becomes MIDDLE(), LEN() becomes LENGTH(),
*LOWER() becomes LOWERCASE(), UPPER() becomes UPPERCASE(),
* DATE(yyyy,mm,dd) becomes COMPUTEDATE(dd;mm;yyyy),
*TODAY(), DAY(),WEEK(), MONTH(),=YEAR(TODAY()),
*EOMONTH() becomes MONTHLENGTH(),
*NOW() should be date and time becomes time only, SECOND(), MINUTE(), HOUR(),
*DBSUM() becomes DSUM(),
;Missing and possibly useful features/functions needed for ignition to have better support of Excel files
There is no Merge and Join Text over many cells, no protect and/or freeze row or columns or books but can LOCK sheets, no define bunch of cells as a name, Macros (Arexx?), conditional formatting, no Solver, no Goal Seek, no Format Painter, no AutoFill, no AutoSum function button, no pivot tables, (30 argument limit applies to Excel)
*HLOOKUP(), VLOOKUP(), [http://production-scheduling.com/excel-index-function-most-useful/ INDEX(), MATCH()], CHOOSE(), TEXT(),
*TRIM(), FIND(), SUBSTITUTE(), CONCATENATE() or &, PROPER(), REPT(),
*[https://acingexcel.com/excel-sumproduct-function/ SUMPRODUCT()], ROUND(), ROUNDUP(), *ROUNDDOWN(), COUNT(), COUNTA(), SUMIF(), COUNTIF(), COUNTBLANK(), TRUNC(),
*PMT(), PV(), FV(), POWER(), SQRT(), MODE(), TRUE, FALSE,
*MODE(), LARGE(), SMALL(), RANK(), STDEV(),
*DCOUNT(), DCOUNTA(), WEEKDAY(),
;Excel Keyboard [http://dmcritchie.mvps.org/excel/shortx2k.htm shortcuts needed to aid usability in Ignition]
<pre>
Ctrl Z - Undo
Ctrl D - Fill Down
Ctrl R - Fill right
Ctrl F - Find
Ctrl H - Replace
Ctrl 1 - Formatting of Cells
CTRL SHIFT ~ Apply General Formatting ie a number
Ctrl ; - Todays Date
F2 - Edit cell
F4 - toggle cell absolute / relative cell references
</pre>
====Document Scanning - Scandal====
Scanner usually needs to be connected via a USB port and not via a hub or extension lead.
Check in Trident Prefs -> Devices that the USB Scanner is not bound to anything (e.g. Bindings None)
If not found then reboot the computer and recheck.
Start Scandal, choose Settings from Menu strip at top of screen and in Scanner Driver choose the ?#.device of the scanner (e.g. epson2.device).
The next two boxes - leave empty as they are for morphos SCSI use only
or put ata.device (use the selection option in bigger box below) and Unit as 0 this is needed for gt68xx
* gt68xx - no editing needed in s/gt68xx.conf but needs a firmware file that corresponds to the scanner [http://www.meier-geinitz.de/sane/gt68xx-backend/ gt68xx firmwares] in sys:s/gt68xx.
* epson2 - Need to edit the file epson2.conf in sys/s that corresponds to the scanner being used
'''Save''' the settings but do not press the Use button (aros freezes)
Back to the Picture Scan window and the right-hand sections.
Click on the '''Information''' tab and press Connect button and the scanner should now be detected.
Go next to the '''Scanner''' tab next to Information Tab should have Color, Black and White, etc. and dpi settings now. Selecting an option Color, B/W etc. can cause dpi settings corruption (especially if the settings are in one line) so set '''dpi first'''. Make sure if Preview is set or not.
In the '''Scan''' Tab, press Scan and the scanner will do its duty.
Be aware that nothing is saved to disk yet.
In the Save tab, change format JPEG, PNG or IFF DEEP. Tick incremental and base filename if necessary and then click the Save button. The image will now be saved to permanent storage.
The driver ignores a device if it is already bond to another USB class, rejects it from being usable. However, open Trident prefs, select your device and use the right mouse button to open. Select "NONE" to prevent poseidon from touching the device. Now save settings. It should always work now.
[[#top|...to the top]]
===Emulators===
==== Amiberry ====
==== Amiga Emu - Janus UAE ====
With Amibridge, AROS attempts to make the UAE emulator seem embedded within but it still is acting as an app
There is no dynarec m68k for each hardware that Aros supports or direct patching of motorola calls to AROS hardware accelerated ones unless the emulator has that included
Try starting Janus with a priority of -1 like this little script:
<pre>
cd sys:system/AmiBridge/emulator
changetaskpri -1
run janus-uae -f my_uaerc.config >nil:
cd sys:prefs
endcli
</pre>
This stops Janus hogging all the CPU time.
===Miscellaneous===
====Screensaver Blanker====
Most blankers on the amiga (i.e. aros) run as commodities (they are in the tools/commodities drawer). Double click on blanker.
Control is with an app called Exchange, which you need to run first (double click on app) or run QUIET sys:tools/commodities/Exchange >NIL: but subsequently can use (Cntrl Alt h).
Icon tool types (may be broken) or command line options
<pre>
seconds=number
</pre>
Once the timing is right then add the following to s:icaros-sequence or s:user-startup
e.g. for 5 minutes
run QUIET sys:tools/commodities/Blanker seconds=300 >NIL:
*[http://archives.aros-exec.org/index.php?function=showfile&file=graphics/screenblanker/gblanker.i386-aros.zip Garshneblanker] can make Aros unstable or slow. Certain blankers crashes in Icaros 2.0.x like Dragon, Executor.
*[ Acuario AROS version], the aquarium screen saver.
Startup: extras:acuariofv-aros/acuario
Kill: c:break name=extras:acuariofv-aros/acuario
Managed to start Acuario by the Executor blanker.
<pre>
cx_priority=
cx_popkey= ie CX_POPKEY="Shift F1"
cx_popup=Yes or No
</pre>
<pre>
Qualifier String Input Event Class
---------------- -----------------
"lshift" IEQUALIFIER_LSHIFT
"rshift" IEQUALIFIER_RSHIFT
"capslock" IEQUALIFIER_CAPSLOCK
"control" IEQUALIFIER_CONTROL
"lalt" IEQUALIFIER_LALT
"ralt" IEQUALIFIER_RALT
"lcommand" IEQUALIFIER_LCOMMAND
"rcommand" IEQUALIFIER_RCOMMAND
"numericpad" IEQUALIFIER_NUMERICPAD
"repeat" IEQUALIFIER_REPEAT
"midbutton" IEQUALIFIER_MIDBUTTON
"rbutton" IEQUALIFIER_RBUTTON
"leftbutton" IEQUALIFIER_LEFTBUTTON
"relativemouse" IEQUALIFIER_RELATIVEMOUSE
</pre>
<pre>
Synonym Synonym
String Identifier
------- ----------
"shift" IXSYM_SHIFT /* look for either shift key */
"caps" IXSYM_CAPS /* look for either shift key or capslock */
"alt" IXSYM_ALT /* look for either alt key */
Highmap is one of the following strings:
"space", "backspace", "tab", "enter", "return", "esc", "del",
"up", "down", "right", "left", "f1", "f2", "f3", "f4", "f5",
"f6", "f7", "f8", "f9", "f10", "help".
</pre>
[[#top|...to the top]]
==== World Construction Set WCS (Version 2.031) ====
WCS is a fractal landscape software such as Scenery Animator, Vista Pro and Panorama. Open sourced February 2022, World Construction Set [https://3dnature.com/downloads/legacy-software/ legally and for free] and [https://github.com/AlphaPixel/3DNature c source].
Announced August 1994 this version dates from April 1996 developed by Gary R. Huber and Chris "Xenon" Hanson" from Questar
<pre>
Assign "WCSProjects:" "Volume:Dir/Dir/WCSProjects"
Assign "WCSFrames:" "Volume:Dir/Dir/WCSFrames"
</pre>
<pre>
Load projects .proj by accessing pull down menu Project -> Open then click on CanyonSunset.proj
OK to changing .par file and enlarge Status Log window to show what is happening
Render by pull down menu Modules -> Render with End equal 1 not 300 then click bottom middle button Render
</pre>
[https://www.youtube.com/watch?v=CxQDmf1ZWG0 Youtube walkthrough of above], [], [],
Also try working with the already built file ColoDemo - Then open with the drop-down menu: Project/Open, then WCSProject:ColoDemo.proj
Which allows you to use altimetric DEM files already included and Loading scene parameters from ColoDemo.par
Once this is done, save everything with a new name to start working exclusively on your project.
Then drop-down menu and select Save As ("NewName".proj name), then drop-down menu to open parameter and select Save All ( .par name)
After launching the software, there is a the Module Control Panel composed of five icons.
It is a dock type shortcut of the first few functions of the drop-down menu
*Database - Load (#?.proj), Append, Create, Edit, Save, Dir List (of WCSProject drawer),
*Data Ops - Extract / Convert Interp DEM, Import DLG, DXF, WDB and export LW map 3d formats
*Map View - Database file Loader leading to Map View Control with option to the Database Editor
*Parameters - Editor for Motion, Color, Ecosystem, Clouds, Waves, management of altimeter files DEM, sclock settings etc
*Render - rendering terrain
These are more in the pull down menu but not in the dock
*Motion Editor
*Color Editor
*Ecosys Editor
Simple minimal workflow
*Load database (1st icon - 1st)
*Set parameters and save .par file (4th icon)
*Render scene (5th icon)
[https://www.youtube.com/watch?v=ZbTwwR2qcc4 Youtube], [],
<pre>
.proj new project name which creates a drawer of additional files
.binary array, ascii array .xyz , z buffer, DTED .dt0, vista 1990s dem, iff conversion
.Obj with .elev, .frd with .hdr maps, - digital elevation model (DEM) is a 3D representation of elevation data in various formats
USGS 7.5MinDEM,
.par
</pre>
Since for the time being no project is loaded, a query window indicates a procedural error when clicking on the rendering icon (right end of the bar). The menu is quite traditional; it varies according to the activity of the windows. To display any altimetric file in the "Mapview" (third icon of the panel), There are three possibilities:
* Loading of a demonstration project.
* The import of a DEM file, followed by texturing and packaging from the "Database-Editor" and the "Color-Editor".
* The creation of an altimetric file in WCS format, then texturing.
The altimeter file editing (display in the menu) is only made possible if the "Mapview" window is active.
The software is made up of many windows and won't be able to describe them all. Know that "Color-Editor" and the "Data-Editor" comprise sufficient functions for obtaining an almost real rendering quality. You have the possibility of inserting vector objects in the "Data-Editor" (creation of roads, railways, etc.)
The Map View (MapView) window
*Database - Objects and Topos
*View - Align, Center, Zoom, Pan, Move
*Draw - Maps and distance
*Object - Find, highlight, add points, conform topo, duplicate
*Motion - Camera, Focus, path, elevation
*Windows - DEM designer, Cloud (.cld) and wave (.wve) editor,
You will notice that by selecting this window and simply moving the pointer to various points on the map you will see latitude and longitude values change, along with the height.
Drop-down menu and Modules, then select MapView and change the width of the window with the map to arrange it in the best way on the screen. With the Auto button the center. Window that then displays the contents of my DEM file, in this case the Grand Canyon. MapView allows you to observe the shape of the landscape from above
ZOOM button
Press the Zoom button and then with the pointer position on a point on the map, press the left mouse button and then move to the opposite corner to circumscribe the chosen area and press the left mouse button again, then we will see the enlarged area selected on the map.
Would add that there is a box next to the Zoom button that allows the direct insertion of a value which, the larger it is, the smaller the magnification and the smaller the value, the stronger the magnification. At each numerical change you will need to press the DRAW button to update the view.
PAN button
Under Zoom you will find the PAN button which allows you to move the map at will in all directions by the amount you want. This is done by drawing a line in one direction, then press PAN and point to an area on the map with the pointer and press the left mouse button. At this point, leave it and move the pointer in one direction by drawing a line and press the left mouse button again to trigger the movement of the map on the screen (origin and end points). Do some experiments and then use the Auto button immediately below to recenter everything.
There are parameters such as TOPO, VEC to be left checked and immediately below one that allows different views of the map with the Style command (Single, Multi, Surface, Emboss, Slope, Contour), each with its own particularities to highlight different details.
Now you have the first basics to manage your project visually on the map. Close the MapView window and go further...
Let's start working on ECOSYSTEMS
If we select Emboss from the MapView Style command we will have a clear idea of how the landscape appears, realizing that it is a predominantly desert region of our planet. Therefore we will begin to act on any vegetation present and the appearance of the landscape.
With WCS we will begin to break down the elements of the landscape by assigning defined characteristics. It will be necessary to determine the classes of the ecosystem (Class) with parameters of Elevation Line (maximum altitude), Relative Elevation (arrangement on basins or convexities with respectively positive or negative parameters), Min Slope and Max Slope (slope). WCS offers the possibility of making ecosystems coexist on the same terrain with the UnderEco function, by setting a Density value.
Ecosys Ecosystem Editor
Let's open it from Modules, then Ecosys Editor. In the left pane you will find the list of ecosystems referring to the files present in our project. It will be necessary to clean up that box to leave only the Water and Snow landscapes and a few other predefined ones. We can do this by selecting the items and pressing the Remove button (be careful not for all elements the button is activated, therefore they cannot all be eliminated).
Once this is done we can start adding new ecosystems. Scroll through the various Unused and as soon as the Name item at the top is activated allowing you to write, type the name of your ecosystem, adding the necessary parameters.
<pre>
Ecosystem1: Name: RockBase Class: Rock Density: 80 MinSlope: 15 UnderEco: Terrain
Ecosystem2: Name: RockIncl Clss: Rock Density: 80 MinSlope: 30 UnderEco: Terrain
Ecosystem3: Name: Grass Class Low Veg Density: 50 Height: 1 Elev Line : 1500 Rel El Eff: 5
Max Slope: 10 – Min Slope: 0 UnderEco: Terrain
Ecosistema4: Name: Shrubs Class: Low Veg Density: 40 Height: 8 Elev Line: 3000
Rel El Eff: -2 Max Slope: 20 Min Slope : 5 UnderEco: Terrain
Ecosistema5: Name: Terrain Class: Ground Density: 100 UnderEco: Terrain
</pre>
Now we need to identify an intermediate ecosystem that guarantees a smooth transition between all, therefore we select as Understory Ecosystem the one called Terrain in all ecosystems, except Snow and Water .
Now we need to 'emerge' the Colorado River in the Canyon and we can do this by raising the sea level to 900 (Sea Level) in the Ecosystem called Water.
Please note that the order of the ecosystem list gives priority to those that come after. So our list must have the following order: Water, Snow, Shrubs, RockIncl, RockBase, Terrain. It is possible to carry out all movements with the Swap button at the bottom. To put order you can also press Short List. Press Keep to confirm all the work done so far with Ecosystem Editor.
Remember every now and then to save both the Project 'Modules/Save' and 'Parameter/Save All'
EcoModels are made up of .etp .fgp .iff8 for each model
Color Editor
Now it's time to define the colors of our scene and we can do this by going to Modules and then Color Editor. In the list we focus on our ecosystems, created first.
Let's go to the bottom of the list and select the first white space, assigning the name 'empty1', with a color we like and then we will find this element again in other environments... It could serve as an example for other situations!
So we move to 'grass' which already exists and assign the following colors: R 60 G 70 B50
<pre>
'shrubs': R 60 G 80 B 30
'RockIncl' R 110 G 65 B 60
'RockBase' R 110 G 80 B 80
' Terrain' R 150 G 30 B 30
<pre>
Now we can work on pre-existing colors
<pre>
'SunLight' R 150 G 130 B 130
'Haze and Fog' R 190 G 170 B 170
'Horizon' R 209 G 185 B 190
'Zenith' R 140 G 150 B 200
'Water' R 90 G 125 B 170
</pre>
Ambient R 0 G 0 B 0
So don't forget to close Color Editor by pressing Keep.
Go once again to Ecosystem Editor and assign the corresponding color to each environment by selecting it using the Ecosystem Color button. Press it several times until the correct one appears. Then save the project and parameters again, as done previously.
Motion Editor
Now it's time to take care of the framing, so let's go to Modules and then to Motion Editor. An extremely feature-rich window will open. Following is the list of parameters regarding the Camera, position and other characteristics:
<pre>
-Camera Altitude: 7.0
-Camera Latitude: 36.075
-Camera Longitude: 112.133
-Focus Attitude: -2.0
-Focus Latitude: 36.275
-Focus Longitude: 112.386
-Camera : 512 → rendering window
-Camera Y: 384 → rendering window
-View Arc: 80 → View width in degrees
-Sun Longitude: 172
-Sun Latitude: -0.9
-Haze Start: 3.8
-Haze Range: 78, 5
</pre>
As soon as the values shown in the relevant sliders have been modified, we will be ready to open the CamView window to observe the wireframe preview. Let's not consider all the controls that will appear.
Well from the Motion Editor if you have selected Camera Altitude and open the CamView panel, you can change the height of the camera by holding down the right mouse button and moving the mouse up and down. To update the view, press the Terrain button in the adjacent window. As soon as you are convinced of the position, confirm again with Keep. You can carry out the same work with the other functions of the camera, such as Focus Altitude...
Let's now see the next positioning step on the Camera map, but let's leave the CamView preview window open while we go to Modules to open the window at the same time MapView. We will thus be able to take advantage of the view from the other together with a subjective one.
From the MapView window, select with the left mouse button and while it is pressed, move the Camera as desired. To update the subjective preview, always click on Terrain.
While with the same procedure you can intervene on the direction of the camera lens, by selecting the cross and with the left button pressed you can choose the desired view. So with the pressure of Terrain I update the Preview. Possibly can enlarge or reduce the Map View using the Zoom button, for greater precision.
Also write that the circle around the cameras indicates the beginning of the haze, there are two types (haze and fog) linked to the altitude. Would also add that the camera height is editable through the Motion Editor panel.
The sun
Let's see that changing the position of the sun from the Motion Editor. Press the SUN button at the bottom right and set the time and the date. Longitude and latitude are automatically obtained by the program. Always open the View Arc command from the Motion Editor panel, an item present in the Parameter List box.
Once again confirm everything with Keep and then save again.
Animation
The animation part is not left-back and also occupies a window. The settings possibilities are enormous. A time line with dragging functions ("slide", "drag"...) comparable to that of LightWave completes this window.
A small window is available for positioning the stars as a function of a date, in order to vary the seasons and their various events (and yes...).
At the bottom of the "Motion-Editor", a "cam-view" function will give you access to a control panel. Different preview modes are possible. The rendering is also accessible through a window. No less than nine pages compose it. At this level, you will be able to determine the backup name of your images ("path"), the type of texture to be calculated, the resolution of the images, activate or deactivate functions such as the depth buffer ("zbuffer"), the blur, the background image, etc.
Once all these parameters have been set, all you have to do is click on the "Render" button.
For rendering go to Modules and then Render. Select the resolution, then under IMA select the name of the image. Move to FRA and indicate the level of fractal detail which of 4 is quite good. Then Keep to confirm and then reopen the window, pressing Render you will see the result. The image will be opened with any viewing program.
Strengths:
* Multi-window.
* Quality of rendering.
* Accuracy.
* Opening, preview and rendering on CyberGraphX screen.
* Extract / Convert Interp DEM, Import DLG, DXF, WDB and export LW map 3d formats
* The "zbuffer" function.
Weaknesses:
* No OpenGL management
* Calculation time.
* No network computing tool.
====Writing CD / DVD - Frying Pan====
Can be backup DVDs (4GB ISO size limit due to use of FileInfoBlock), create audio cds from mp3's, and put .iso files on discs
If using for the first time - click Drive button and Device set to ata.device and unit to 0 (zero)
Click Tracks Button - Drive 1 - Create New Disc or Import Existing Disc Image (iso bin/cue etc.) - Session File open cue file
If you're making a data cd, with files and drawers from your hard drive, you should be using the ISO Builder.. which is the MUI page on the left. ("Data/Audio Tracks" is on the right).
You should use the "Data/Audio tracks" page if you want to create music cds with AIFF/WAV/MP3 files, or if you download an .iso file, and you want to put it on a cd.
Click WRITE Button - set write speed - click on long Write button
Examples
Easiest way would be to burn a DATA CD, simply go to "Tracks" page "ISO Builder" and "ADD" everything you need to burn.
On the "Write" page i have "Masterize Disc (DAO)", "Close Disc" and "Eject after Write" set.
One must not "Blank disc before write" if one uses a CDR
AUDIO CD from MP3's are as easy but tricky to deal with. FP only understands one MP3 format, Layer II, everything else will just create empty tracks
Burning bootable CD's works only with .iso files. Go to "Tracks" page and "Data/Audio Tracks" and add the .iso
====odf====
Every ODF file is a collection of several subdocuments within a package (ZIP file), each of which stores part of the complete document.
* content.xml – Document content and automatic styles used in the content.
* styles.xml – Styles used in the document content and automatic styles used in the styles themselves.
* meta.xml – Document meta information, such as the author or the time of the last save action.
* settings.xml – Application-specific settings, such as the window size or printer information.
To read document follow these steps:
* Extracting .ods file.
* Getting content.xml file (which contains sheets data).
* Creating XmlDocument object from content.xml file.
* Creating DataSet (that represent Spreadsheet file).
* With XmlDocument select “table:table” elements, and then create adequate DataTables.
* Parse child’s of “table:table” element and fill DataTables with those data.
* At the end, return DataSet and show it in application’s interface.
To write document follow these steps:
* Extracting template.ods file (.ods file that we use as template).
* Getting content.xml file.
* Creating XmlDocument object from content.xml file.
* Erasing all “table:table” elements from the content.xml file.
* Reading data from our DataSet and composing adequate “table:table” elements.
* Adding “table:table” elements to content.xml file.
* Zipping that file as new .ods file.
XLS file format
The XLS file format contains streams, substreams, and records.
These sheet substreams include worksheets, macro sheets, chart sheets, dialog sheets, and VBA module sheets.
All the records in an XLS document start with a 2-byte unsigned integer to specify Record Type (rt), and another for Count of Bytes (cb). A record cannot exceed 8224 bytes. If larger than the rest is stored in one or more continue records.
* Workbook stream
**Globals substream
***BoundSheet8 record - info for Worksheet substream i.e. name, location, type, and visibility. (4bytes the lbPlyPos FilePointer, specifies the position in the Workbook stream where the sheet substream starts)
**Worksheet substream (sheet) - Cell Table - Row record - Cells (2byte=row 2byte=column 2byte=XF format)
***Blank cell record
***RK cell record 32-bit number.
***BoolErr cell record (2-byte Bes structure that may be either a Boolean value or an error code)
***Number cell record (64-bit floating-point number)
***LabelSst cell record (4-byte integer that specifies a string in the Shared Strings Table (SST). Specifically, the integer corresponds to the array index in the RGB field of the SST)
***Formula cell record (FormulaValue structure in the 8 bytes that follow the cell structure. The next 6 bytes can be ignored, and the rest of the record is a CellParsedFormula structure that contains the formula itself)
***MulBlank record (first 2 bytes give the row, and the next 2 bytes give the column that the series of blanks starts at. Next, a variable length array of cell structures follows to store formatting information, and the last 2 bytes show what column the series of blanks ends on)
***MulRK record
***Shared String Table (SST) contains all of the string values in the workbook.
ACCRINT(), ACCRINTM(), AMORDEGRC(), AMORLINC(),
COUPDAYBS(), COUPDAYS(), COUPDAYSNC(), COUPNCD(), COUPNUM(), COUPPCD(),
CUMIPMT(), CUMPRINC(),
DB(), DDB(), DISC(),
DOLLARDE(), DOLLARFR(),
DURATION(), EFFECT(), FV(), FVSCHEDULE(),
INTRATE(), IPMT(), IRR(), ISPMT(), MDURATION(), MIRR(), NOMINAL(), NPER(), NPV(),
ODDFPRICE(), ODDFYIELD(), ODDLPRICE(), ODDLYIELD(),
PMT(), PPMT(), PRICE(), PRICEDISC(), PRICEMAT(), PV(), RATE(),
RECEIVED(), SLN(), SYD(), TBILLEQ(), TBILLPRICE(), TBILLYIELD(),
VDB(), XIRR(), XNPV(), YIELD(), YIELDDISC(), YIELDMAT(),
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
{{BookCat}}
423m20o2be2m4j5s0iq41oxz4aaabwc
4669669
4669661
2026-09-11T10:51:54Z
Jeff1138
301139
4669669
wikitext
text/x-wiki
==Introduction==
[[#Graphical Image Editing Art]]
[[#Office Application]]
[[#Audio]]
[[#Misc Application]]
[[#Games & Emulation]]
[[#Application Guides]]
[[#top|...to the top]]
[[#top|...to the top]]
Most apps can be opened on the Workbench (aka publicscreen pubscreen) which is the default display option but can offer a custom one set to your configurations (aka custom screen mode promotion). These custom ones tend to stack so the possible use of A-M/A-N method of switching between full screens and the ability to pull down screens as well
If you are interested in creating or porting new software, see [http://en.wikibooks.org/wiki/Aros/Developer/Docs here]
{| class="wikitable sortable"
|-
!width:30%;|Internet Applications
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1 (68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Web Online Browser [],
|<!--AROS-->Odyssey 2.0, [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1175&highlight=odyssey&rowstart=100 Odyssey 3.0], [https://juen.in/ Amelinium], [],
|<!--Amiga OS-->[https://aminet.net/comm/www Amelinium], [https://blog.alb42.de/programs/amifox/ amifox] with [https://github.com/alb42/wrp wrp server], IBrowse*, Voyager*, [https://github.com/amigazen/aweb3/ AWeb 3.6 src], [https://github.com/matjam/aweb AWeb Src], [http://aminet.net/package/comm/www/NetSurf-m68k-sources Netsurf], [],
|<!--AmigaOS4-->[ Odyssey OWB], [ Timberwolf (Firefox port 2011)], [http://amigaworld.net/modules/newbb/viewtopic.php?forum=32&topic_id=32847 OWB-mui], [http://strohmayer.org/owb/ OWB-Reaction], IBrowse*, [http://os4depot.net/index.php?function=showfile&file=network/browser/aweb.lha AWeb], Voyager, [http://www.os4depot.net/index.php?function=browse&cat=network/browser Netsurf],
|<!--MorphOS-->Wayfarer, [http://fabportnawak.free.fr/owb/ Odyssey OWB], [ Netsurf], IBrowse*, AWeb, [],
|-
|<!--Sub Menu-->YouTube, Dailymotion website downloading videos audio [https://github.com/yt-dlp/yt-dlp yt-dlp], [https://clipgrab.org/ clipgrab],
|<!--AROS-->[], [https://blog.alb42.de/amitube/ Amitube],
|<!--Amiga OS-->[https://blog.alb42.de/amitube/ Amitube], [ smtube],
|<!--AmigaOS4-->[https://blog.alb42.de/amitube/ Amitube], getVideo, Tubexx, [https://github.com/walkero-gr/aiostreams aiostreams],
|<!--MorphOS-->[ ytsearch], [https://blog.alb42.de/amitube/ Amitube], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 getVideo], Tubexx
|-
|<!--Sub Menu-->Old style E-mailing SMTP POP3 IMAP based
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/email SimpleMail], [http://sourceforge.net/projects/simplemail/files/ src], [https://github.com/jens-maus/yam YAM]
|<!--Amiga OS-->[http://sourceforge.net/projects/simplemail/files/ SimpleMail], [https://github.com/jens-maus/yam YAM]
|<!--AmigaOS4-->SimpleMail, YAM,
|<!--MorphOS--> SimpleMail, YAM
|-
|<!--Sub Menu-->IRC, ICB,
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/chat WookieChat], [https://sourceforge.net/projects/wookiechat/ Wookiechat src], [http://archives.arosworld.org/index.php?function=browse&cat=network/chat AiRcOS], Jabberwocky,
|<!--Amiga OS-->Wookiechat, AmIRC
|<!--AmigaOS4-->Wookiechat
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=5 Wookiechat], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 AmIRC],
|-
|<!--Sub Menu-->Instant Messaging IM like [https://github.com/BlitterStudio/amidon Hollywood lang based Mastodon client], BlueSky AT protocol, Facebook(TM), Twitter X (TM), Bitlbee IRC Gateway and others
|<!--AROS-->[https://github.com/kaffeine1/telegram-amiga telegram-amiga], [http://archives.arosworld.org/index.php?function=browse&cat=network/chat jabberwocky],
|<!--Amiga OS-->[http://amitwitter.sourceforge.net/ AmiTwitter], CLIMM, SabreMSN, jabberwocky,
|<!--AmigaOS4-->[http://amitwitter.sourceforge.net/ AmiTwitter], SabreMSN,
|<!--MorphOS-->[http://amitwitter.sourceforge.net/ AmiTwitter], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 PolyglotNG], SabreMSN,
|-
|<!--Sub Menu-->Torrents
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/p2p ArTorr],
|<!--Amiga OS-->
|<!--AmigaOS4-->CTorrent, Transmission
|<!--MorphOS-->MLDonkey, Beehive, [http://morphos.lukysoft.cz/en/vypis.php?kat=5 Transmission], CTorrent,
|-
|<!--Sub Menu-->FTP
|<!--AROS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], MarranoFTP,
|<!--Amiga OS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], [http://aminet.net/package/comm/tcp/AmiFTP AmiFTP], AmiTradeCenter, ncFTP,
|<!--AmigaOS4-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan],
|<!--MorphOS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 Pftp], [http://aminet.net/package/comm/tcp/AmiFTP-1.935-OS4 AmiFTP],
|-
|<!--Sub Menu-->WYSIWYG Web Site Editor
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Internet Radio Streaming Audio [http://www.gnu.org/software/gnump3d/ gnump3d], [http://www.icecast.org/ Icecast2] Server (Broadcast) and Client (Listen), [ mpd], [http://darkice.sourceforge.net/ DarkIce], [http://www.dyne.org/software/muse/ Muse],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/misc], Mplayer (Icecast Client only),
|<!--Amiga OS-->[https://github.com/sandlbn/TuneFinder TuneFinder C Src], [https://github.com/sandlbn/TuneFinderMUI TuneFinderMUI], [http://amigazeux.net/anr/ AmiNetRadio], [], [],
|<!--AmigaOS4-->[http://www.tunenet.co.uk/ Tunenet],
|<!--MorphOS-->Mplayer, AmiNetRadio,
|-
|<!--Sub Menu-->VoIP (Voice over IP) with SIP Client (Session Initiation Protocol) or Asterisk IAX2 Clients Softphone (skype like)
|<!--AROS-->
|<!--Amiga OS-->AmiPhone with Speak Freely,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Weather Forecast
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ WeatherBar], [http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench AWeather], []
|<!--Amiga OS-->[http://amigazeux.net/wetter/ Wetter], [https://github.com/emartisoft/AmiWeatherForecasts AmiWeatherForecasts src],
|<!--AmigaOS4-->[http://os4depot.net/?function=showfile&file=utility/workbench/flipclock.lha FlipClock],
|<!--MorphOS-->[http://amigazeux.net/wetter/ Wetter],
|-
|<!--Sub Menu-->Street Road Maps Route Planning GPS Tracking
|<!--AROS-->[https://blog.alb42.de/programs/muimapparium/ MuiMapparium] [https://build.alb42.de/ Build of MuiMapp versions],
|<!--Amiga OS-->AmiAtlas*, UKRoutePlus*, [http://blog.alb42.de/ AmOSM],
|<!--AmigaOS4-->
|<!--MorphOS-->[http://blog.alb42.de/programs/mapparium/ Mapparium],
|-
|<!--Sub Menu-->Clock and Date setting from the internet (either ntp or websites) [https://www.timeanddate.com/worldclock/ World Clock], [http://www.time.gov/ NIST], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/misc ntpsync],
|<!--Amiga OS-->ntpsync
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Newsgroups
|<!--AROS-->
|<!--Amiga OS-->[http://newscoaster.sourceforge.net/ Newscoaster], [https://github.com/jens-maus/newsrog NewsRog], [ WorldNews],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->RSS
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/Team-Boingo/AmiRSS AmiRSS src]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->AI
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/murinsel/AmigaAI Claude], [https://github.com/geekychris/amiga_mcp AI on host machine], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->BBS
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Graphical Image Editing Art==
{| class="wikitable sortable"
|-
!width:30%;|Image Editing
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Pixel Raster Artwork [https://github.com/LibreSprite/LibreSprite LibreSprite based on GPL aseprite], [https://github.com/abetusk/hsvhero hsvhero], [],
|<!--AROS-->[https://sourceforge.net/projects/zunetools/files/ZunePaint/ ZunePaint], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit LunaPaint], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit GrafX2], [ LodePaint needs OpenGL],
|<!--Amiga OS-->[http://www.amigaforever.com/classic/download.html PPaint], GrafX2, [https://github.com/grovdata/Amiga_Sources/blob/master/software.md DeluxePaint], [http://www.amiforce.de/perfectpaint/perfectpaint.php PerfectPaint], Zoetrope, Brilliance2*,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=graphics/edit LodePaint], GrafX2,
|<!--MorphOS-->Sketch, Pixel*, GrafX2, [http://morphos.lukysoft.cz/en/vypis.php?kat=3 LunaPaint]
|-
|<!--Sub Menu-->Image viewing
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ ZuneView], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer LookHere], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer LoView], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer PicShow] , [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album],
|<!--Amiga OS-->PicShow, PicView, Photoalbum,
|<!--AmigaOS4-->WarpView, PicShow, flPhoto, Thumbs, [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 ShowGirls], [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album]
|-
|<!--Sub Menu-->Photography retouching / Image Manipulation like Photoshop(tm)
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit RNOEffects],
|<!--Amiga OS-->[ Tecsoft Video Paint aka TVPaint], Photogenics*, ArtEffect*, ImageFX*, XiPaint, fxPaint, ImageMasterRT, Opalpaint,
|<!--AmigaOS4-->WarpView, flPhoto, [http://www.os4depot.net/index.php?function=browse&cat=graphics/edit Photocrop]
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 ShowGirls], ImageFX*,
|-
|<!--Sub Menu-->Manage RAW picture folder galleries like Darktable, RAWtherapy, etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Graphic Format Converter - ICC profile support sRGB, Adobe RGB, XYZ and linear RGB
|<!--AROS-->
|<!--Amiga OS-->GraphicsConverter, ImageStudio, [http://www.coplabs.org/artpro.html ArtPro]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Thumbnail Generator [],
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ ZuneView], [http://archives.arosworld.org/index.php?function=browse&cat=utility/shell Thumbnail Generator]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Icon Editor
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/iconedit Archives], [http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench Icon Toolbox],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=graphics/iconedit IconEditor]
|<!--MorphOS-->
|-
|<!--Sub Menu-->2D Pixel Art Animation
|<!--AROS-->Lunapaint
|<!--Amiga OS-->PPaint, AnimatED, Scala*, GoldDisk MovieSetter*, Walt Disney's Animation Studio*, ProDAD*, [https://github.com/historicalsource/DeluxePaint DeluxePaint src], Brilliance
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 Titler]
|-
|<!--Sub Menu-->2D SVG based MovieSetter type
|<!--AROS-->
|<!--Amiga OS-->MovieSetter*, Fantavision*
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Morphing
|<!--AROS-->[ GLMorph]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->2D Cad (qcad->LibreCAD, etc.)
|<!--AROS-->
|<!--Amiga OS-->Xcad, MaxonCAD
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Cad like FreeCad, BRL-CAD, OpenSCAD, AvoCADo, etc. using dxf, obj (vertices), blend,
|<!--AROS-->
|<!--Amiga OS-->XCad3d*, DynaCADD*, Cycas,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Model Rendering of glft (json) gbl (png jpg), usdz (USD files with materials, textures, and animations), FBX Filmbox is a proprietary Autodesk format,
|<!--AROS-->POV-Ray
|<!--Amiga OS-->[http://www.discreetfx.com./amigaproducts.html CINEMA 4D]*, POV-Ray, Lightwave3D*, Real3D*, Caligari24*, Reflections/Monzoom*, [https://github.com/privatosan/RayStorm Raystorm src], Tornado 3D
|<!--AmigaOS4-->Blender, POV-Ray, Yafray
|<!--MorphOS-->Blender, POV-Ray, Yafray
|-
|<!--Sub Menu-->3D Format Converter [], [],
|<!--AROS-->[https://archives.arosworld.org/?function=showfile&file=graphics/convert/ 3doc.i386-aros], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=showfile&file=graphics/convert/ivcon.lha IVCon]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen grabbing display
|<!--AROS-->[ Screengrabber], [http://archives.arosworld.org/index.php?function=browse&cat=utility/misc snapit], [http://archives.arosworld.org/index.php?function=browse&cat=video/record screen recorder], []
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Grab graphics music from apps [https://github.com/Malvineous/ripper6 ripper6], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Office Application==
{| class="wikitable sortable"
|-
!width:30%;|Office
!width:10%;|AROS (x86)
!width:10%;|[http://en.wikipedia.org/wiki/Amiga_software Commodore-Amiga OS 3.1] (68k)
!width:10%;|[http://en.wikipedia.org/wiki/AmigaOS_4 Hyperion OS4] (PPC)
!width:10%;|[http://en.wikipedia.org/wiki/MorphOS MorphOS] (PPC)
|-
|<!--Sub Menu-->Office Suite
|<!--AROS-->
|<!--Amiga OS-->[ Softwood Final Office], [ Wordworth Office], [ Digita Office], [ The Works!], [ Europress Mini Office], [], [ Papyrus Office Demo],
|<!--AmigaOS4-->
|<!--MorphOS-->[ Papyrus Office],
|-
|<!--Sub Menu-->Word-processing
|<!--AROS-->[https://finalwriter.godaddysites.com/ Final Writer 7*], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1995&rowstart=20&pid=12668#post_12668 Slovo], [https://github.com/sodero/MUI-Vim/releases MUI-Vim], [https://archives.arosworld.org/index.php?function=browse&cat=office/wordprocessing Cinnamon Writer], [],
|<!--AmigaOS-->[ Softwood FinalCopy II*], Haage AmigaWriter*, Digita WordWorth*, Softwood FinalWriter*, Micro-Systems Excellence 3*, Arnor Protext, Rashumon, [ InterWord], [ KindWords], [WordPerfect], [ New Horizons Flow], [ CygnusEd Pro], [ Micro-systems Scribble],
|<!--AmigaOS4-->AbiWord, [ CinnamonWriter],
|<!--MorphOS-->[ Cinnamon Writer], [http://www.meta-morphos.org/viewtopic.php?topic=1246&forum=53 scriba], [http://morphos.lukysoft.cz/en/index.php Papyrus Office],
|-
|<!--Sub Menu-->Spreadsheets
|<!--AROS-->[https://blog.alb42.de/programs/leu/ Leu], [https://archives.arosworld.org/index.php?function=browse&cat=office/spreadsheet ],
|<!--AmigaOS-->[https://aminet.net/package/biz/spread/ignition-src Ignition Src 1.3], [MaxiPlan 500 Plus], [OXXI Plan/IT v2.0 Speadsheet], [ Superplan], [ Creative Developments TurboCalc], [ ProCalc], [ InterSpread], [Digita DGCalc], [ Gold Disk Advantage], [ Micro-systems Analyze!]
|<!--AmigaOS4-->Gnumeric, [https://ignition-amiga.sourceforge.net/ Ignition],
|<!--MorphOS-->[ ignition], [http://morphos.lukysoft.cz/en/vypis.php Papyrus Office],
|-
|<!--Sub Menu-->Presentations
|<!--AROS-->[http://www.hollywoood-mal.com/ Hollywood]*,
|<!--Amiga OS-->[http://www.hollywoood-mal.com/ Hollywood]*, MediaPoint, PointRider, Scala*,
|<!--Amiga OS4-->[http://www.hollywoood-mal.com/ Hollywood]*, PointRider
|<!--MorphOS-->[http://www.hollywoood-mal.com/ Hollywood]*, PointRider
|-
|<!--Sub Menu-->Databases
|<!--AROS-->[http://sdb.freeforums.org/ SDB], [http://archives.arosworld.org/index.php?function=browse&cat=office/database BeeBase],
|<!--Amiga OS-->Precision Superbase 4 Pro*, Arnor Prodata*, BeeBase, Datastore, FinalData*, AmigaBase, Fiasco, Twist2*, [Digita DGBase], [],
|<!--AmigaOS4-->BeeBase, SQLite,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=6 BeeBase],
|-
|<!--Sub Menu-->PDF Viewing and editing digital signatures
|<!--AROS-->[http://sourceforge.net/projects/arospdf/ ArosPDF via splash], [https://github.com/wattoc/AROS-vpdf vpdf wip],
|<!--Amiga OS-->APDF
|<!--AmigaOS4-->AmiPDF
|<!--MorphOS-->APDF, vPDF,
|-
|<!--Sub Menu-->Note Taking markdown support like Obsidian like, joplin, OneNote, EverNotes, xournalpp, etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Study and analyse, collect, organize, annotate, cite, and share
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->PIM Personal Information Manager - Day Diary Planner Calendar App
|<!--AROS-->[ ], [ ], [ ],
|<!--Amiga OS-->Digita Organiser*, On The Ball, Everyday Organiser, [ Contact Manager],
|<!--AmigaOS4-->AOrganiser,
|<!--MorphOS-->[http://polymere.free.fr/orga_en.html PolyOrga],
|-
|<!--Sub Menu-->Accounting
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=office/misc ETB], LoanCalc, [ ], [ ], [ ],
|[ Digita Home Accounts2], Accountant, Small Business Accounts, Account Master, [ Amigabok],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Project Management Research
|<!--AROS-->
|<!--Amiga OS-->SuperGantt, SuperPlan,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Desktop
|<!--AROS-->Wanderer, Scalos, Workbook, DOpus5,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[https://github.com/zapek/Ambient Ambient Src]
|-
|<!--Sub Menu-->System Wide Search
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=utility/filetool Finder], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System Wide Dictionary - multilingual [http://sourceforge.net/projects/babiloo/ Babiloo], [http://code.google.com/p/stardict-3/ StarDict],
|<!--AROS-->[ ],
|<!--AmigaOS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System wide Thesaurus - multi lingual
|<!--AROS-->[ ],
|Kuma K-Roget*,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Sticky Desktop Notes (post it type)
|<!--AROS-->[http://aminet.net/package/util/wb/amimemos.i386-aros AmiMemos], [https://aminet.net/package/util/wb/amimemos.src-aros AmiMemos Src], [],
|<!--Amiga OS-->[http://aminet.net/package/util/wb/StickIt-2.00 StickIt v2],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->DTP Desktop Publishing
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit RNOPublisher],
|<!--Amiga OS-->[http://pagestream.org/ Pagestream]*, Professional Pro Page*, Saxon Publisher, Pagesetter, PenPal,
|<!--AmigaOS4-->[http://pagestream.org/ Pagestream]*
|<!--MorphOS-->[http://pagestream.org/ Pagestream]*
|-
|<!--Sub Menu-->Printing
|<!--AROS-->Postscript 3 laser printers, [https://github.com/bohunamiga/MintPRINT MintPRINT AirPrint IPP], [ Ghostscript], [],
|<!--Amiga OS-->[https://github.com/boingball/MintPRINT MintPRINT IPP], [https://github.com/Andiweli/AmiAirprint AmiAirprint], [http://www.irseesoft.de/tp_what.htm TurboPrint]*, [ GutenPrint], [https://aminet.net/package/comm/tcp/NetPrinter NetPrinter LPR], [], [],
|<!--AmigaOS4-->(some native drivers),
|<!--MorphOS-->early TurboPrint included, [https://aminet.net/package/comm/tcp/NetPrinter NetPrinter LPR],
|-
|<!--Sub Menu-->Scanning
|<!--AROS-->[ SCANdal], [],
|<!--Amiga OS-->FxScan*, ScanQuix*
|<!--AmigaOS4-->SCANdal (Sane)
|<!--MorphOS-->SCANdal
|-
|<!--Sub Menu-->OCR
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/convert gOCR]
|<!--AmigaOS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos-files.net/categories/office/text Tesseract]
|-
|<!--Sub Menu-->Text Editing
|<!--AROS-->Jano Editor (already installed as Editor), [http://archives.arosworld.org/index.php?function=browse&cat=development/edit EdiSyn], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit Annotate], [https://archives.arosworld.org/index.php?function=browse&cat=development/edit Vim], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit FrexxEd] [https://github.com/vidarh/FrexxEd src], [ NoWinEd],
|<!--Amiga OS-->[https://aminet.net/package/text/edit/TurboText20 TurboText20 ttx], Annotate, MicroGoldED/CubicIDE*, CygnusED*, Protext*, NoWinED,
|<!--AmigaOS4-->Notepad, Annotate, CygnusED*, NoWinED,
|<!--MorphOS-->MorphOS ED, NoWinED, GoldED/CubicIDE*, CygnusED*, Annotate,
|-
|<!--Sub Menu-->Office Fonts [http://sourceforge.net/projects/fontforge/files/fontforge-source/ Font Designer]
|<!--AROS-->[ ], [ ],
|<!--Amiga OS-->TypeSmith*, SaxonScript (GetFont Adobe Type 1),
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Drawing Vector
|<!--AROS-->[http://sourceforge.net/projects/amifig/ ZuneFIG previously AmiFIG], [https://github.com/serk118/designworks-aros designworks aros 64bit]
|<!--Amiga OS-->Drawstudio*, ProVector*, ArtExpression*, Professional Draw*, AmiFIG, MetaView, [https://gitlab.com/amigasourcecodepreservation/designworks Design Works Src], [],
|<!--AmigaOS4-->MindSpace, [http://www.os4depot.net/index.php?function=browse&cat=graphics/edit amifig],
|<!--MorphOS-->SteamDraw, [http://aminet.net/package/gfx/edit/amifig amiFIG],
|-
|<!--Sub Menu-->video conferencing (jitsi)
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->source code hosting
|<!--AROS-->Gitlab,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Remote Desktop (server)
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/VNC_Server ArosVNCServer],
|<!--Amiga OS-->[http://s.guillard.free.fr/AmiVNC/AmiVNC.htm AmiVNC], [http://dspach.free.fr/amiga/avnc/index.html AVNC]
|<!--AmigaOS4-->[http://s.guillard.free.fr/AmiVNC/AmiVNC.htm AmiVNC]
|MorphVNC, vncserver
|-
|<!--Sub Menu-->Remote Desktop (client) login and connect to another machine
|<!--AROS-->[https://sourceforge.net/projects/zunetools/files/VNC_Client/ ArosVNC], [http://archives.arosworld.org/index.php?function=browse&cat=network/misc rdesktop],
|<!--Amiga OS-->[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://dspach.free.fr/amiga/vva/index.html VVA], [http://www.hd-zone.com/ RDesktop]
|<!--AmigaOS4-->[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://www.hd-zone.com/ RDesktop]
|[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://www.hd-zone.com/ RDesktop]
|-
|<!--Sub Menu-->notifications
|<!--AROS-->
|<!--Amiga OS-->Ranchero
|<!--AmigaOS4-->Ringhio
|<!--MorphOS-->MagicBeacon
|-
|<!--Sub Menu-->Biometric facial logins and fingerprint security features
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Audio==
{| class="wikitable sortable"
|-
!width:30%;|Audio
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Playing playback Audio like MP3, [https://github.com/chrg127/gmplayer NSF], [https://github.com/kode54/lazyusf miniusf .usflib] [https://gitlab.com/kode54/psflib with pfslib], [], [], etc
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/play Mplayer], [ HarmonyPlayer hp], [http://www.a500.org/downloads/audio/index.xhtml playcdda] CDs, [ WildMidi Player], [https://bszili.morphos.me/ UADE mod player], [], [ RNOTunes], [ mp3Player], [],
|<!--Amiga OS-->AmiNetRadio, AmigaAmp, playOGG, [https://codeberg.org/tygre/amimodradio amimodradio]
|<!--AmigaOS4-->TuneNet, SimplePlay, AmigaAmp, TKPlayer
|AmiNetRadio, Mplayer, Kaya, AmigaAmp
|-
|<!--Sub Menu-->Editing Audio
|<!--AROS-->[ Audio Evolution 4]
|<!--Amiga OS-->[https://sourceforge.net/projects/hd-rec/ HD-Rec Src], [http://www.sonicpulse.de/eng/news.html SoundFX], [ Samplitude],
|<!--AmigaOS4-->[https://sourceforge.net/projects/hd-rec/ HD-Rec], AmiSoundED, [http://os4depot.net/?function=showfile&file=audio/record/audioevolution4.lha Audio Evolution 4]
|[http://www.hd-rec.de/HD-Rec/index.php?site=home HD-Rec],
|-
|<!--Sub Menu-->Editing Tracker Music
|<!--AROS-->[https://github.com/hitchhikr/protrekkr Protrekkr], [ Schism Tracker], [http://archives.arosworld.org/index.php?function=browse&cat=audio/tracker MilkyTracker], [http://www.hivelytracker.com/ HivelyTracker], [ Radium in AROS already], [http://www.a500.org/downloads/development/index.xhtml libMikMod],
|<!--Amiga OS-->MilkyTracker, HivelyTracker, DigiBooster, Octamed SoundStudio, [https://github.com/elindstrom/soundtracker soundtracker],
|<!--AmigaOS4-->MilkyTracker, HivelyTracker, GoatTracker
|MilkyTracker, GoatTracker, DigiBooster,
|-
|<!--Sub Menu-->Editing Music [], [https://github.com/kmatheussen/camd CAMD] and/or staves and musical notes on manuscript
|<!--AROS-->[http://bnp.hansfaust.de/ Bars and Pipes], [], [],
|<!--Amiga OS-->[http://bnp.hansfaust.de/ Bars'n'Pipes], MusicX* David "Talin" Joiner & Craig Weeks (for Notator-X), Deluxe Music Construction Set DMCS2*, [https://github.com/timoinutilis/midi-sequencer-amigaos Horny c Src], HD-Rec, [https://aminet.net/package/mus/midi/dominatorV1_51 Dominator], [https://github.com/royaltm/Amiga-midiIn Amiga-midiIn]
|<!--AmigaOS4-->[https://sourceforge.net/p/hd-rec/code/HEAD/tree/ HD-Rec Src], Rockbeat, [http://bnp.hansfaust.de/download.html Bars'n'Pipes], [http://os4depot.net/index.php?function=browse&cat=audio/edit Horny], Audio Evolution 4,
|<!--MorphOS-->Bars'n'Pipes,
|-
|<!--Sub Menu-->Sound Sampling
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/record Audio Evolution 4], [http://www.imica.net/SitePortalPage.aspx?siteid=1&did=162 Quick Record], [https://archives.arosworld.org/index.php?function=browse&cat=audio/misc SOX to get AIFF 16bit files], [https://github.com/aros-development-team/AROS/tree/master/workbench/tools/AHIRecord AHIRecord],
|<!--Amiga OS-->[https://aminet.net/package/mus/edit/AudioEvolution3_src Audio Evolution 3 c src], [ Samplitude]*, Audiomaster IV*,
|<!--AmigaOS4-->[https://github.com/timoinutilis/phonolith-amigaos phonolith c src], HD-Rec, Audio Evolution 4,
|<!--MorphOS-->[https://sourceforge.net/p/hd-rec/code/HEAD/tree/ HD-Rec Src], Audio Evolution 4,
|-
|<!--Sub Menu-->Audio Processing like easyeffects so having limiter, compressor, convolver, equalizer and auto volume and many other plugins
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Live Looping or Audio Misc - Groovebox like
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->CD/DVD burn
|[https://code.google.com/p/amiga-fryingpan/ FryingPan],
|<!--Amiga OS-->FryingPan, [http://www.estamos.de/makecd/#CurrentVersion MakeCD],
|<!--AmigaOS4-->FryingPan, AmiDVD,
|[http://www.amiga.org/forums/printthread.php?t=58736 FryingPan], Jalopeano,
|-
|<!--Sub Menu-->CD/DVD audio rip
|Lame, [http://www.imica.net/SitePortalPage.aspx?siteid=1&cfid=0&did=167 Quick CDrip],
|<!--Amiga OS-->Lame,
|<!--AmigaOS4-->Lame,
|Lame,
|-
|<!--Sub Menu-->MP3 v1 and v2 Tagger
|<!--AROS-->id3ren (v1), [http://archives.arosworld.org/index.php?function=browse&cat=audio/edit mp3info],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|
|-
|<!--Sub Menu-->Audio Convert
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/misc Sox], [],
|<!--Amiga OS-->[http://aminet.net/package/mus/misc/SoundBox SoundBox], [http://aminet.net/package/mus/misc/SoundBoxKey SoundBox Key], [http://aminet.net/package/mus/edit/SampleE SampleE], sox
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->DJ mixing jamming
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/djh0ffman/PT1210 Hoffman PT1210 DJ tracker], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Radio Automation Software [http://www.rivendellaudio.org/ Rivendell], [http://code.campware.org/projects/livesupport/report/3 Campware LiveSupport], [http://www.sourcefabric.org/en/airtime/ SourceFabric AirTime], [http://www.ohloh.net/p/mediabox404 MediaBox404],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Speakers Audio Sonos Mains AC networked wired controlled
*2005 ZP100 with ZP80
*2008 Zoneplayer ZP120 (multi-room wireless amp) ZP90 receiver only with CR100 controller,
*2009 ZonePlayer S5,
*2010 BR100 wireless Bridge (no support),
*2011 Play:3
*2013 Bridge (no support), Play:1,
*2016 Arc, Play:1,
*Beam (Gen 2), Playbar, Ray, Era 100, Era 300, Roam, Move 2,
*Sub (Gen 3), Sub Mini, Five, Amp S2
|<!--AROS-->SonosController
|<!--Amiga OS-->SonosController
|<!--AmigaOS4-->SonosController
|<!--MorphOS-->SonosController
|-
|<!--Sub Menu-->Smart Speakers
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Video Creativity and Production==
{| class="wikitable sortable"
|-
!width:30%;|Video
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Playing Video
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/play Mplayer], [ VAMP], [http://www.a500.org/downloads/video/index.xhtml CDXL player], [http://www.a500.org/downloads/video/index.xhtml IffAnimPlay], [],
|<!--Amiga OS-->Frogger*, AMP2, MPlayer, RiVA*, MooViD*,
|<!--AmigaOS4-->DvPlayer, MPlayer
|<!--MorphOS-->MPlayer, Frogger, AMP2, VLC
|-
|<!--Sub Menu-->Streaming Video and game streaming like OBS studio, Parsec, [https://github.com/lizardbyte/sunshine sunshine], [https://github.com/moonlight-stream/moonlight-qt moonlight], etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Playing DVD
|<!--AROS-->[http://a-mc.biz/ AMC]*, Mplayer
|<!--Amiga OS-->AMP2, Frogger
|<!--AmigaOS4-->[http://a-mc.biz/ AMC]*, DvPlayer*, AMP2,
|<!--MorphOS-->Mplayer
|-
|<!--Sub Menu-->Screen Recording
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/record Screenrecorder], [ ], [ ], [ ], [ ],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->Screenrecorder,
|-
|<!--Sub Menu-->Create Edit Individual Video - Amiga like OSs have no pro NLE
|<!--AROS-->[ Mencoder], [ Quick Videos], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit AVIbuild], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/misc FrameBuild], FFMPEG,
|<!--Amiga OS-->[ MainConcept Mainactor Broadcast*], [http://en.wikipedia.org/wiki/Video_Toaster Video Toaster*], MacroSystem MovieShop 4.3*, proDAD Adorage*, [ IOSpirit VHI studio]*, [Gold Disk ShowMaker], [],
|<!--AmigaOS4-->FFMpeg/GUI
|<!--MorphOS-->Blender, Mencoder, FFmpeg
|-
|<!--Sub Menu-->Subtitle editor
|<!--AROS-->[https://aminet.net/package/text/edit/Slarti_Arosx86ABIv0 Slarti_Arosx86ABIv0], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->IP-based video production workflows with High Dynamic Range (HDR), 10-bit color collaborative NDI,
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Blogging like Lemmy or kbin
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR face recognition for Vtubers
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR chatting Live2D models with Cubism type editor or [https://github.com/AyagamiDev/ayagami ayagami] like with zipped moc3 with model metadata (model3, cdi3)
<pre>
Model data (cmo3)
Basic motions (can3)
Background image (png)
Set of files for embedding (runtime folder)
• Model data (moc3)
• Motion data (motion3.json)
• Model settings file (model3.json)
• Physics settings file (physics3.json)
• Display auxiliary file (cdi3.json)
</pre>
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR chatting chatters .VRML models - standardized 3D file format for VR avatars
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->V-tubers V-tubing like Vseeface with Openseeface tracker or Vpuppr (virtual puppet project) for online live 2d / 3d art models rigging rigged LIV
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Misc Application==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1 (68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->File Management
|<!--AROS-->DOpus4, [https://github.com/BlitterStudio/dopus5 DOpus Magellan aka DOpus 5], [ Scalos], [ ],
|<!--Amiga OS-->DOpus2, DOpus 4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], ClassAction, FileMaster, [http://www.amiga.org/forums/showthread.php?t=4897 DirWork 2]*, [https://github.com/RudolphRiedel/DiskMaster2 DiskMaster2 src],
|<!--AmigaOS4-->DOpus4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], Filer, AmiDisk
|<!--MorphOS-->DOpus4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan],
|-
|<!--Sub Menu-->File Verification / Repair
|<!--AROS-->[https://arosarchives.os4depot.net/index.php?function=browse&cat=utility md5sum], [https://arosarchives.os4depot.net/index.php?function=browse&cat=utility/filetool asum], [http://archives.arosworld.org/index.php?function=browse&cat=utility/filetool workpar2] (PAR2), [http://zakalwe.fi/~shd/foss/cksfv/files/ compile cksfv from website],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->Par2,
|-
|Application Installer
|<!--AROS-->[], [ InstallerNG],
|<!--Amiga OS-->InstallerNG, Grunch,
|<!--AmigaOS4-->Jack
|<!--MorphOS-->Jack
|-
|<!--Sub Menu-->Compression archiver [https://github.com/FS-make-simple/paq9a paq9a], [],
|<!--AROS-->XAD system is a toolkit designed for handling various file and disk archiver
|<!--Amiga OS-->
|<!--AmigaOS4-->[https://aminet.net/package/util/pack/decrunchmania_os4 Crunchmania CrM2 depacker],
|<!--MorphOS-->
|-
|<!--Sub Menu-->Binary Hexadecimal Editor
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=development/edit Zaphod], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Repository
|<!--AROS-->[ Git]
|<!--Amiga OS-->
|<!--AmigaOS4-->Git
|<!--MorphOS-->
|-
|<!--Sub Menu-->Filesystem Partition Editor formatter Disk Management
|<!--AROS-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1440&highlight=partition&pid=8821#post_8821 QuickPart], [ HDToolBox]
|<!--Amiga OS-->[https://github.com/stefanskotte/hdpart hdpart], [https://github.com/ChuckyGang/AmiPart AmiPart],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Filesystem Repair and backups
|<!--AROS-->ArSFSDoctor,
|<!--Amiga OS-->[https://aminet.net/package/disk/bakup/quarterback_src Quarterback Tools C and asm src], [ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System Disk check, integrity and history [https://github.com/smartmontools/smartmontools smart tools], [],
|<!--AROS-->
|<!--Amiga OS-->[],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Multiple File renaming
|<!--AROS-->DOpus 4 or 5,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Anti Virus
|<!--AROS-->
|<!--Amiga OS-->VChecker,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Random Wallpaper Desktop changer [ DOpus5], [ Scalos],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Alarm Clock, Timer, Stopwatch, Countdown
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench DClock], [http://aminet.net/util/time/AlarmClockAROS.lha AlarmClock], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Fortune Cookie Quotes Sayings
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/misc AFortune],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->C/C++ IDE
|<!--AROS-->[https://sourceforge.net/projects/aidea/ AIDEa], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit FrexxEd], [https://github.com/vidarh/FrexxEd FrexxEd src], Annotate, Murks,
|<!--Amiga OS-->[http://devplex.awardspace.biz/cubic/index.html Cubic IDE]*, Annotate,
|<!--AmigaOS4-->CodeBench , [https://gitlab.com/boemann/codecraft CodeCraft],
|<!--MorphOS-->[http://devplex.awardspace.biz/cubic/index.html Cubic IDE]*, Anontate,
|-
|<!--Sub Menu-->BASIC Computer Language
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=development/language Basic4SDL], [ Ace Basic], [ X-AMOS], [SDLBasic], [ Alvyn],
|<!--Amiga OS-->[http://www.amiforce.de/main.php Amiblitz 3], [http://amos.condor.serverpro3.com/AmosProManual/contents/c1.html Amos Pro], [http://aminet.net/package/dev/basic/ace24dist ACE Basic],
|<!--AmigaOS4-->
|<!--MorphOS-->sdlBasic
|-
|<!--Sub Menu-->Computer Languages Translation [https://tetracorp.github.io/guide/reverse-engineering-amiga.html], [https://amigasourcecodepreservation.gitlab.io/amiga-assembler-insider-guide/], [https://github.com/kermitfrog/Amiga-Re-Engineering Rust, Ghidra and FS-UAE],
|<!--AROS-->
|<!--Amiga OS-->[https://bitbucket.org/rhinoid/convert68000toc/src/main/ convert m68k seka asm-one to c],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Gui Creators
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=development/guitool MuiBuilder],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[ MuiBuilder],
|-
|<!--Sub Menu-->Catalog .cd .ct Custom App Language Editors
|<!--AROS-->FlexCat, [https://archives.arosworld.org/index.php?function=browse&cat=utility Flexcat GUI], [],
|<!--Amiga OS-->[http://www.geit.de/deu_simplecat.html SimpleCat], FlexCat
|<!--AmigaOS4-->[http://aminet.net/package/dev/misc/simplecat SimpleCat], FlexCat
|<!--MorphOS-->[http://www.geit.de/deu_simplecat.html SimpleCat], FlexCat
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Misc Application 2==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->System
|<!--AROS-->[ SysExplorer], [ SysMon], [ Scout], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Terminals Shells CLIs
|<!--AROS-->[https://tomaszstaniak.com/aros-term/ aros-term], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->OSK On Screen Keyboard
|<!--AROS-->[],
|<!--Amiga OS-->[https://aminet.net/util/wb/OSK.lha OSK]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen Magnifier Magnifying Glass Magnification
|<!--AROS-->[http://www.onyxsoft.se/files/zoomit.lha ZoomIT],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Comic Book CBR CBZ format reader viewer
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer comics], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer comicon], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Ebook Reader
|<!--AROS-->[https://blog.alb42.de/programs/#legadon Legadon EPUB],[]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Ebook Converter
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Text to Speech tts [https://github.com/JonathanFly/bark-installer Bark], [],
|<!--AROS-->[ Echo " " >SPEAK:A1 inbuilt], [http://archives.arosworld.org/index.php?function=browse&cat=audio/misc flite],
|<!--Amiga OS-->[http://www.text2speech.com translator],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=search&tool=simple FLite]
|<!--MorphOS-->[http://se.aminet.net/pub/aminet/mus/misc/ FLite]
|-
|<!--Sub Menu-->Speech Voice Recognition Dictation - [http://sourceforge.net/projects/cmusphinx/files/ CMU Sphinx], [http://julius.sourceforge.jp/en_index.php?q=en/index.html Julius], [http://www.isip.piconepress.com/projects/speech/index.html ISIP],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Speech Voice Changer [], [], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen Display Blanker screensaver
|<!--AROS-->Blanker Commodity (built in), [https://archives.arosworld.org/index.php?function=browse&cat=graphics/screenblanker GarshneBlanker], [http://sourceforge.net/projects/gblanker/ GBlanker Src], [],
|<!--Amiga OS-->MultiCX,
|<!--AmigaOS4-->
|<!--MorphOS-->ModernArt Blanker,
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
==Misc Application 3==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Fractals mandelbrot, etc
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=graphics/misc],
|<!--Amiga OS-->ZoneXplorer,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Landscape Rendering
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=graphics/raytrace WCS World Construction Set],
|<!--Amiga OS-->[ Vista Pro], [http://en.wikipedia.org/wiki/World_Construction_Set World Construction Set]
|<!--AmigaOS4-->[ WCS World Construction Set],
|<!--MorphOS-->[ WCS World Construction Set],
|-
|<!--Sub Menu-->Astronomy [https://sourceforge.net/projects/skychart/ skychart freepascal], [], [],
|<!--AROS-->[ Digital Almanac (ABIv0 only)],
|<!--Amiga OS-->[http://aminet.net/search?query=planetarium Aminet search], [http://aminet.net/misc/sci/DA3V56ISO.zip Digital Almanac], [https://aminet.net/package/misc/sci/da3sourceV58 Src c V58], [ Galileo renamed to Distant Suns]*, [],
|<!--AmigaOS4-->[http://sourceforge.net/projects/digital-almanac/ Digital Almanac], Distant Suns*, [http://www.digitaluniverse.org.uk/ Digital Universe]*,
|<!--MorphOS-->[http://www.aminet.net/misc/sci/da3.lha Digital Almanac], [http://www.aminet.net/package/misc/sci/da3-mos-src Src c V56],
|-
|<!--Sub Menu-->Astrology [https://sourceforge.net/projects/skylendar/ skylendar], [https://github.com/CruiserOne/Astrolog Astrolog], [https://www.astrolog.org/astrolog/astfile.htm Astrology alt site], [https://saravali.github.io/download.html Maitreya], [https://github.com/alamahant/Asteria Asteria],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Genealogy History Family Tree Ancestry Records (FreeBMD, FreeREG, and FreeCEN file formats or GEDCOM GenTree)
|<!--AROS-->
|<!--Amiga OS--> [ Origins], [ Your Family Tree], [ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Languages
|<!--AROS-->
|<!--Amiga OS-->Fun School,
|<!--AmigaOS4-->
|<!--MorphOS-->https://github.com/evil4dmin/ami2ha
|-
|<!--Sub Menu-->Mathematics ([http://www-fourier.ujf-grenoble.fr/~parisse/install_en.html Xcas], etc.),
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/scientific mathX]
|<!--Amiga OS-->Maple V, mathX, Fun School, GCSE Maths, [ ], [ ], [ ],
|<!--AmigaOS4-->Yacas
|<!--MorphOS-->Yacas
|-
|<!--Sub Menu-->Maths Graph Function Plotting
|<!--AROS-->[https://blog.alb42.de/programs/#MUIPlot MUIPlot],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->App Utility Launcher Dock toolbar
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/docky BoingBar], [],
|<!--Amiga OS-->[https://github.com/adkennan/DockBot Dockbot],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Printer [https://github.com/OrcaSlicer/OrcaSlicer OrcaSlicer]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->PCB design
|<!--AROS-->
|<!--Amiga OS-->[ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Digital Signage
|<!--AROS-->Hollywood, Hollywood Designer
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->HAM radio, amateur radio, packet radio, [], [], [], [https://cemaxecuter.com/ Dragon OS], [https://github.com/km4ack/73Linux with 73 link update], [https://www.youtube.com/watch?v=YAL5KNePRSg video for],
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/punktniklas/NiKom NiKom], [https://www.amigarealm.com/amiga/amicomms/comm4.htm Comm4], [https://www.amigarealm.com/archives/comms/aarug/ TNC Terminal Node Controller with packets over serial connections on Yaesu or Woxum handheld], [https://aminet.net/comm/misc AmiCom], [ with 7Plus file encoder/decoder], [ mksstv], [ RTTYam],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Home Assistant
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/evil4dmin/ami2ha HA]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Games & Emulation==
Some emulators/games require OpenGL to function and to adjust ahi prefs channels, frequency and unit0 and unit1 and
[http://aros.sourceforge.net/documentation/users/shell/changetaskpri.php changetaskpri -1]
Rom patching https://www.marcrobledo.com/RomPatcher.js/ https://www.romhacking.net/patch/ (ips, ups, bps, etc) and this other site supports the latter formats https://hack64.net/tools/patcher.php
Free public domain roms for use with emulators can be found [http://www.pdroms.de/ here] as most of the rest are covered by copyright rules. If you like to read about old games see [http://retrogamingtimes.com/ here] and [http://www.armchairarcade.com/neo/ here] and a [http://www.vintagecomputing.com/ blog] about old computers. Possibly some of the [http://www.answers.com/topic/list-of-best-selling-computer-and-video-games best selling] of all time. [http://en.wikipedia.org/wiki/List_of_computer_system_emulators Wiki] with emulated systems list.
[https://archive.gamehistory.org/ Archive of VGHF], [https://library.gamehistory.org/ Video Game History Foundation Library search]
{| class="wikitable sortable"
|-
!width:10%;|Games [http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Emulation]
!width:10%;|AROS(x86)
!width:10%;|AmigaOS3(68k)
!width:10%;|AmigaOS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Games Emulation Amstrad CPC
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [ Caprice32 (OpenGL & pure SDL)], [ Arnold], [https://retroshowcase.gr/cpcbox-master/],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://os4depot.net/index.php?function=browse&cat=emulation/computer]
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2],
|-
|<!--Sub Menu-->Games Emulation Apple2 and 2GS
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Arcade
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Mame], [ SI Emu (ABIv0 only)],
|<!--Amiga OS-->Mame,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem xmame], amiarcadia,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2 Mame],
|-
|<!--Sub Menu-->Games Emulation Atari 2600 [], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Stella],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 5200 [https://github.com/wavemotion-dave/A5200DS A5200DS], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 7800
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 400 800 130XL [https://github.com/wavemotion-dave/A8DS A8DS], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Atari800],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari Lynx
|<!--AROS-->[http://myfreefilehosting.com/f/6366e11bdf_1.93MB Handy (ABIv0 only)],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari Jaguar
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Bandai Wonderswan
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation BBC Micro and Acorn Electron [http://beehttps://bem-unix.bbcmicro.com/download.html BeebEm], [http://b-em.bbcmicro.com/ B-Em], [http://elkulator.acornelectron.co.uk/ Elkulator], [http://electrem.emuunlim.com/ ElectrEm],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Dragon 32 and Tandy CoCo [http://www.6809.org.uk/xroar/ xroar], [],
|<!--AROS-->[], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Commodore C16 Plus4
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Commodore C64
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Vice (ABIv0 only)], [],
|<!--Amiga OS-->Frodo,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem viceplus],
|<!--MorphOS-->Vice,
|-
|<!--Sub Menu-->Games Emulation Commodore Amiga
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Janus UAE], Emumiga,
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://os4depot.net/index.php?function=browse&cat=emulation/computer UAE],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2 UAE],
|-
|<!--Sub Menu-->Games Emulation Japanese MSX MSX2
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Mattel Intelivision
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Mattel Colecovision and Adam
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Milton Bradley (MB) Vectrex [ Vectrex OpenGL],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation PICO8 Pico-8 fantasy video game console [https://github.com/egordorichev/pemsa-sdl/ pemsa-sdl], [https://github.com/jtothebell/fake-08 fake-08], [https://github.com/Epicpkmn11/fake-08/tree/wip fake-08 fork],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo Gameboy
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem vba no sound], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem vba]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo NES
|<!--AROS-->[ EmiNES], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Fceu], [https://github.com/takahirox/nes-js?tab=readme-ov-file nes-js], [https://github.com/bfirsh/jsnes jsnes], [https://github.com/angelo-wf/NesJs NesJs],
|<!--Amiga OS-->AmiNES, [http://www.dridus.com/~nyef/darcnes/ darcNES],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem amines]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo SNES
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Zsnes],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem warpsnes]
|<!--MorphOS-->[http://fabportnawak.free.fr/snes/ Snes9x],
|-
|<!--Sub Menu-->Games Emulation Nintendo N64
*HLE and plugins [ mupen64], [https://github.com/ares-emulator/ares ares], [https://github.com/N64Recomp/N64Recomp N64Recomp], [https://github.com/rt64/rt64 rt64], [https://github.com/simple64/simple64 Simple64],
*LLE [],
|<!--AROS-->[http://code.google.com/p/mupen64plus/ Mupen64+],
|<!--Amiga OS-->[http://code.google.com/p/mupen64plus/ Mupen64+], [http://aminet.net/package/misc/emu/tr-981125_src TR64],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Nintendo Gamecube Wii]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Nintendo Wii U]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://github.com/yuzu-emu Nintendo Switch]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation NEC PC Engine
|<!--AROS-->[], [], [https://github.com/yhzmr442/jspce js-pce],
|[http://www.hugo.fr.fm/ Hugo], [http://mednafen.sourceforge.net/ Mednafen],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem tgemu]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Master System (SMS)
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Dega], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem sms],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem osmose]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Genesis/Megadrive
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem gp no sound], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem DGen],
|<!--Amiga OS-->[http://code.google.com/p/genplus-gx/ Genplus],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem genesisplus]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Saturn
*HLE [https://mednafen.github.io/ mednafen], [http://yabause.org/ yabause], [],
*LLE [], [],
|<!--AROS-->?
|<!--Amiga OS-->[http://yabause.org/ Yabause],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Dreamcast
*HLE [https://github.com/flyinghead/flycast flycast], [https://code.google.com/archive/p/nulldc/downloads NullDC],
*LLE [], [],
|<!--AROS-->?
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair ZX80 and ZX81
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair Spectrum
|[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Fuse (crackly sound)], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer SimCoupe], [ FBZX slow], [https://jsspeccy.zxdemo.org/ jsspeccy], [http://torinak.com/qaop/games qaop],
|<!--Amiga OS-->[http://www.lasernet.plus.com/ Asp], [http://www.zophar.net/sinclair.html Speculator], [http://www.worldofspectrum.org/x128/index.html X128],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/computer]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair QL
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [],
|<!--Amiga OS-->[http://aminet.net/package/misc/emu/QDOS4amiga1 QDOS4amiga]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation SNK NeoGeo Pocket
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem gngeo], NeoPop,
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sony PlayStation
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem FPSE],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem FPSE]
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Sony PS2]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Sony PS3]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://vita3k.org/ Sony Vita]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://github.com/shadps4-emu/shadPS4 PS4]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation [http://en.wikipedia.org/wiki/Tangerine_Computer_Systems Tangerine] Oric and Atmos
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Oricutron]
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem Oricutron]
|<!--MorphOS-->[http://aminet.net/package/misc/emu/oricutron Oricutron]
|-
|<!--Sub Menu-->Games Emulation TI 99/4 99/4A [https://github.com/wavemotion-dave/DS994a DS994a], [], [https://js99er.net/#/ js99er], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer],
|<!--Amiga OS-->[http://aminet.net/package/misc/emu/TI4Amiga TI4Amiga], [http://aminet.net/package/misc/emu/TI4Amiga_src TI4Amiga src in c],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation HP 38G 40GS 48 49G/50G Graphing Calculators
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation TI 58 83 84 85 86 - 89 92 Graphing Calculators
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
{| class="wikitable sortable"
|-
!width:10%;|Games [https://www.rockpapershotgun.com/ General]
!width:10%;|AROS(x86)
!width:10%;|AmigaOS3(68k)
!width:10%;|AmigaOS4(PPC)
!width:10%;|MorphOS(PPC)
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Games [https://www.trackawesomelist.com/michelpereira/awesome-open-source-games/ Open Source and others] || AROS || Amiga OS || Amiga OS4 || Morphos
|-
|<!--Sub Menu-->Games Action like [https://github.com/opentomb/OpenTomb opentomb], [https://github.com/LostArtefacts/TRX TRX formerly Tomb1Main], [https://github.com/TombEngine TombEngine], [http://archives.arosworld.org/index.php?function=browse&cat=game/action Thrust], [https://github.com/fragglet/sdl-sopwith sdl sopwith],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/action], [https://archives.arosworld.org/index.php?function=browse&cat=game/action BOH], [],
|<!--Amiga OS-->[https://github.com/BSzili/OpenLara/tree/amiga/src source of openlara SDL2],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Adventure like [http://dotg.sourceforge.net/ DMJ], [https://github.com/kromenak/gengine Gabriel Knight 3], [http://www.sarien.net/ Sierra Sarien], [https://github.com/klembot/twinejs twine js], [https://github.com/QSPFoundation/qspgui Quest Soft Player QSP], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/adventure dmagnetic], [https://archives.arosworld.org/?function=browse&cat=emulation/misc ScummVM], [https://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying frotz infocom], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Board like [https://github.com/aperture-software/colditz-escape escape from colditz], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/board], [http://amigan.1emu.net/releases Africa]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Cards
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/card], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=180&pid=12934#post_12934 Balatro],
|<!--AmigaOS-->[http://home.arcor.de/amigasolitaire/e/welcome.html Reko], [https://github.com/samskivert/beschei-en beschei Src],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Misc [https://github.com/michelpereira/awesome-open-source-games Awesome open], [https://github.com/bobeff/open-source-games General Open Source], [https://github.com/SAT-R/sa2 Sonic Advance 2], [https://github.com/velorek1/cwordle Wordle type],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/misc], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games FPS like [https://aminet.net/package/game/shoot/D1X_Rebirth_AGA Descent D1X src], [https://github.com/DescentDevelopers/Descent3 Descent 3], [https://github.com/Fewnity/Counter-Strike-Nintendo-DS Counter-Strike-Nintendo-DS], [https://github.com/Aleph-One-Marathon/alephone Bungie Marathon 1994], [https://zdoom.org/downloads UzDoom opengl 3.3], [https://github.com/ZDoom/gzdoom gzdoom opengl 3+], [https://zdoom.org/downloads LZDoom opengl 2.1],
|<!--AROS-->Doom, Quake, [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Quake 3 Arena (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Cube (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Assault Cube (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Cube 2 Sauerbraten (OpenGL)], [http://fodquake.net/test/ FodQuake QuakeWorld], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Duke Nukem 3D], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Darkplaces Nexuiz Xonotic], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Doom 3 SDL (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Hexenworld and Hexen 2], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Aliens vs Predator Gold 2000 avp (openGL)], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Odamex (openGL doom)], [https://archives.arosworld.org/?function=showfile&file=game/fps/ zgloom], [], [https://archives.arosworld.org/?function=showfile&file=game/fps/ ab3dhd], [],
|<!--Amiga OS-->Doom, Quake, AB3D, Fears, Breathless, Gloom,
|<!--AmigaOS4-->Doom, Quake,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12 Doom], Quake, Quake 3 Arena, [https://github.com/OpenXRay/xray-16 S.T.A.L.K.E.R Xray]
|-
|<!--Sub Menu-->Games MMORG like
|<!--AROS-->[ Eternal Lands (OpenGL)],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Platform like
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/platform], [ Maze of Galious], [ Gish]*(openGL), [ Mega Mario], [https://archives.arosworld.org/?function=showfile&file=game/platform/ thextech SMBX], [http://www.gianas-return.de/ Giana's Return], [http://www.sqrxz.de/ Sqrxz], [www.sqrxz2.de/ Sqrxz 2], [http://www.sqrxz.de/sqrxz-3/ Sqrxz 3], [http://www.sqrxz.de/sqrxz-4/ Sqrxz 4], [http://archives.arosworld.org/index.php?function=browse&cat=game/platform Cave Story], [https://bszili.morphos.me/ Frogatto], [https://bszili.morphos.me/ OpenJazz], [https://archives.arosworld.org/?function=showfile&file=game/platform/ pekkakana2], [ Aquaria], [https://archives.arosworld.org/?function=showfile&file=game/platform/ sonic CD], [],
|<!--Amiga OS-->[ Giana Sisters], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Puzzle [https://github.com/mariopartyrd/marioparty4/tree/port Party], [https://github.com/mdodis/OpenSolomonsKey OpenSolomonsKey], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/puzzle], [ Cubosphere (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/puzzle Candy Crisis], [http://bszili.morphos.me/ TailTale],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Racing [ Trigger Rally], [ VDrift], [http://www.ultimatestunts.nl/index.php?page=2&lang=en Ultimate Stunts], [http://maniadrive.raydium.org/ Mania Drive], [https://github.com/plowteam/donut Simpsons Hit and Run], [],
|<!--AROS-->[ Super Tux Kart (OpenGL)], [http://www.dusabledanslherbe.eu/AROSPage/F1Spirit.30.html F1 Spirit (OpenGL)], [http://bszili.morphos.me/index.html MultiRacer], [https://bszili.morphos.me/ Speed Dreams], [https://archives.arosworld.org/?function=showfile&file=game/driving/dethrace-0.10.1.x86_64-aros-v11.zip Carmageddon dethrace 64bit], [],
|<!--AmigaOS-->
|<!--AmigaOS4-->[http://bszili.morphos.me/index.html Speed Dreams],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12], [http://bszili.morphos.me/index.html TORCS],
|-
|<!--Sub Menu-->Games 1st first person DRPG [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/OpenEnroth/OpenEnroth OpenEnroth MM], []
|<!--AROS-->[https://github.com/BSzili/aros-stuff Arx Libertatis], [http://www.playfuljs.com/a-first-person-engine-in-265-lines/ js raycaster], [https://github.com/Dorthu/es6-crpg webgl], [https://github.com/sonountaleban/AmiShockolate System Shock], [], [],
|<!--AmigaOS-->Phantasie, Faery Tale, Dungeon Master,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games 3rd third person action CRPG [https://sourceforge.net/projects/sumwars/ Summoning Wars], [https://www.solarus-games.org/ Solarus], [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/alexbatalov/fallout1-ce fallout ce], [https://github.com/rwengine/openrw gta3], [https://github.com/gta-reversed/gta-reversed gta3 sa], [https://github.com/mrxenginner/reVC gta3 vc revc],
|<!--AROS-->[https://archives.arosworld.org/?function=showfile&file=game/strategy/ fheroes2 homm2], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ breakhack], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ devilutionx diablo 1 hellfire], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ fallout 1], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ stratagus], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ hostile-takeover], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games isometric RPG [https://sourceforge.net/projects/sumwars/ Summoning Wars], [https://www.solarus-games.org/ Solarus], [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/topics/dungeon?l=javascript Dungeon], [], [https://github.com/clintbellanger/heroine-dusk JS Dusk],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying nethack], [https://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying GemRB], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games card based RPG [https://github.com/open-duelyst/duelyst Duelyst], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games turn based tactics RPG [], [], [], [], [], [],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/strategy UFO AI], [http://play.freeciv.org/ FreeCiv], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Strategy [http://rtsgus.org/ RTSgus], [http://stargus.sourceforge.net/ Stargus], [https://github.com/KD-lab-Open-Source/Perimeter Perimeter], [https://matty77.itch.io/conflict-3049 conflict-3049], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/strategy MegaGlest (OpenGL)], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ signus], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=140&pid=12446#post_12446 Wargus warcraft 2 setup],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12]
|-
|<!--Sub Menu-->Games Rhythm, Beat, Step [], [], [https://clonehero.net/ clonehero], [https://github.com/MatteoGodzilla/Dj-Engine Dj-Engine],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/misc Frets on Fire], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Shoot Em Ups [http://www.mhgames.org/oldies/formido/ Formido], [http://code.google.com/p/violetland/ Violetland],
||<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/action Open Tyrian], [http://www.parallelrealities.co.uk/projects/starfighter.php Starfighter], [ Alien Blaster], [https://github.com/OpenFodder/openfodder OpenFodder], [https://archives.arosworld.org/?function=showfile&file=game/action/ tbftss The Battle for the Solar System: the Pandora War]
|<!--AmigaOS-->
|<!--AmigaOS4-->[http://www.parallelrealities.co.uk/projects/starfighter.php Starfighter], [ The Battle for the Solar System: the Pandora War]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Simulations [http://scp.indiegames.us/ Freespace 2], [http://www.heptargon.de/gl-117/gl-117.html GL117], [http://code.google.com/p/corsix-th/ Theme Hospital], [http://code.google.com/p/freerct/ Rollercoaster Tycoon], [http://hedgewars.org/ Hedgewars], [https://github.com/raceintospace/raceintospace raceintospace], [https://github.com/Return-To-The-Roots RTTR Settlers 2], [https://github.com/OoliteProject/oolite oolite elite], [https://github.com/fesh0r/newkind newkind elite], [https://github.com/bohemiainteractive/cwr Arma Cold War Src], [], [],
|<!--AROS-->
|<!--Amiga OS-->SimCity, SimAnt, Sim Hospital, Theme Park, [https://github.com/angree/openttd_amiga_68k openttd amiga_68k],
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12]
|-
|<!--Sub Menu-->Games Life Sim [https://github.com/ACreTeam/forest Animal Crossing], [ ], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Horror [https://github.com/Mikompilation/MikuPan Fatal Frame], [ ], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Sandbox Voxel Open World Exploration [https://github.com/ClassiCube/ Classicube],[http://www.michaelfogleman.com/craft/ Craft], [https://github.com/tothpaul/DelphiCraft DelphiCraft],[https://www.minetest.net/ Luanti formerly Minetest], [ infiniminer],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Battle Royale [https://bruh.io/ Play.Bruh.io], [https://www.coolmathgames.com/0-copter Copter Royale], [https://surviv.io/ Surviv.io], [https://nuggetroyale.io/#Ketchup Nugget Royale], [https://miniroyale2.io/ Miniroyale2.io],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Tower Defense [https://chriscourses.github.io/tower-defense/ HTML5], [https://github.com/SBardak/Tower-Defense-Game TD C++], [https://github.com/bdoms/love_defense LUA and LOVE], [https://github.com/HyOsori/Osori-WebGame HTML5], [https://github.com/PascalCorpsman/ConfigTD ConfigTD Pascal], [https://github.com/GloriousEggroll/wine-ge-custom Wine], []
|<!--AROS-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=180&pid=12871#post_12871 Plants vs Zombies PvZ],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Visual Novel Engines [https://github.com/diane1f0cd/VisualNovelTemplate Visual Novel Template], [https://github.com/Kirilllive/tuesday-js Tuesday JS], [https://github.com/tejasnayak25/vnsutra vnsutra], [https://github.com/weetabix-su/renpsp-dev RenPSP], [https://github.com/Galladite27/ONScripter-EN ONScripter-EN], [https://github.com/NathanGuilhot/VNES-Raylib https://github.com/NathanGuilhot/VNES VNES in Raylib], [https://www.renpy.org/latest.html renpy ren'py python based],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Reality VR [https://gitlab.com/madsbuvi/openmw openmw vr], [https://github.com/Team-Beef-Studios/BeefRaiderXR BeefRaiderXR],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Table Top VTT [ Roll20], [https://www.owlbear.rodeo/ owlbear rodeo], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Computer assisted TableTop TTRPG OSR [https://www.rpgsolo.com/play.php RPGSolo], [https://github.com/fpsvogel/solo-ttrpgs Solo TTRPG], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games 2D 3D Engines [https://github.com/fegennari/3DWorld 3DWorld], [https://github.com/GarageGames/Torque3D Torque3D], [https://github.com/gameplay3d/GamePlay GamePlay 3D], [https://www.babylonjs.com/ BabylonJS ], [ Godot], [ Ogre], [ Crystal Space], [https://github.com/JacobHess03/ Dragon-Quest like], [https://github.com/bjornbytes/lovr Lua LOVE for 2D LOVR for 3D], [],
|<!--AROS-->[https://www.arkhamdev.net/wiki.htm?id=agx Arkham Development antiryadgx 8.9 lts with register], [],
|<!--Amiga OS-->[https://github.com/alpyre/Sevgi_Engine Sevgi Engine], [], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games C based game frameworks [https://github.com/orangeduck/Corange Corange], [https://github.com/scottcgi/Mojoc Mojoc], [https://orx-project.org/ Orx], [https://github.com/ioquake/ioq3 Quake 3], [https://www.mapeditor.org/ Tiled], [https://www.raylib.com/ 2d Raylib], [https://github.com/Rabios/awesome-raylib other raylib], [https://github.com/MrFrenik/gunslinger Gunslinger], [https://o3de.org/ o3d], [http://archives.aros-exec.org/index.php?function=browse&cat=development/library GLFW], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=development/library Raylib 5],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games RPGMaker MV/MZ-compatible projects [https://github.com/Psychronic-Games/RPGReactor RPGReactor js],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Pinball [https://github.com/vpinball/vpinball vpinball], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games unpack unarc [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
==Application Guides==
[[#top|...to the top]]
===Web Browser===
OWB is now at version 2.0 (which got an engine refresh, from July 2015 to February 2019) and 3.0.
This latest version has a good support for many/most web sites, even YouTube web page now works. [https://www.bilibili.tv/en/search untested]
This improved compatibility comes at the expense of higher RAM usage (now 1GB RAM is the absolute minimum).
Also, keep in mind that the lack of a JIT (Just-In-Time) JS compiler on the 32 bit version, makes the web surfing a bit slow.
Only the 64 bit version of OWB 2.0 will have JIT enabled, thus benefitting of more speed. There are tooltypes that can be added to the icon to provide further features JIT, MSE etc
Certificates from [https://curl.se/docs/caextract.html ca certs],
DNS tracking blocking with [https://easylist.to/easylist/easylist.txt easylist.txt] in PROGDIR:Conf before starting browser with enabled AdBlock [https://github.com/easylist/easylist/tree/master easylist], [https://gitlab.com/eyeo anti abp], [https://firebog.net/ big blocklist], [https://github.com/StevenBlack/hosts Steves], [], [],
This can be enabled with OWB Odyssey with Windows -> Content Blocking and Windows -> Messages and enter
https://www.youtube.com/api/stats/ads*
https://www.youtube.com/pagead/adview*
https://www.youtube.com#@##player-ads*
into your custom filters
Element blocker browser extension might be needed for [https://github.com/easylist/easylist/wiki/Youtube-Issues youtube], [ mid roll], [ pre roll], [ ],
OWB speed is much better when running from RAM Disk, the best way is to add the below into your S:User-Startup which copies OWB drawer from Extras:Internet/OWB to RAM Disk:
So add this :
<pre>
copy Extras:Internet/OWB Ram:OWB/ ALL CLONE >NIL:
copy Extras:Internet/OWB.info Ram: >NIL:
</pre>
Open RAM Disk and open OWB drawer and double click on OWB icon so that the above icon tooltypes are activated
Problems are that the copy time is long (around 20 seconds added in the background), but we can make it faster if we delete useless files from the OWB drawer (docs, …)
If you don’t copy the drawer back onto the HD, you won’t save your cache, cookies, passwords… So you need a script for it.
Error messages
SSL error "cant verify with ca-certificates", check bios clock time date is correct
Error 6, try checking networking prefs settings and Save / Use preferences again or a '''few times''' otherwise the network chipset may not be compatible with Aros
[https://www.google.com/search?q=%s&udm=14 Google search without AI overview]
===E-mail===
YAM does not support SSL and most mail providers now switched to encrypted SMTP/POP3 connections
====SimpleMail====
SimpleMail supports IMAP and appears to work with GMail, but it's never been reliable enough, it can crash with large mailboxes.
Please read more on this [http://www.freelists.org/list/simplemail-usr User list]
GMail
Be sure to activate the pop3 usage in your gmail account setup / configuration first.
pop3:
pop.gmail.com
Use SSL: Yes
Port: 995
smtp:
smtp.gmail.com (with authentication)
Use Authentication: Yes
Use SSL: Yes
Port: 465 or 587
Hotmail/MSN/outlook/Microsoft Mail mid-2017, all outlook.com accounts will be migrated to Office 365 / Exchange
Most users are currently on POP which does not allow showing folders and many other features (technical limitations of POP3). With Microsoft IMAP you will get folders, sync read/unread, and show flags. You still won't get push though, as Microsoft has not turned on the IMAP Idle command as at Sept 2013.
If you want to try it, you need to first remove (you can't edit) your pop account (long-press the account on the accounts screen, delete account). Then set it up this way:
1. Email/Password
2. Manual
3. IMAP
4.
* Incoming: imap-mail.outlook.com, port 993, SSL/TLS should be checked
* Outgoing: smtp-mail.outlook.com, port 587, SSL/TLS should be checked
* POP server name pop-mail.outlook.com, port 995, POP encryption method SSL
Yahoo Mail
On April 24, 2002 Yahoo ceased to offer POP access to its free mail service. Introducing instead a yearly payment feature, allowing users POP3 and IMAP server support, along with such benefits as larger file attachment sizes and no adverts.
Sorry to see Yahoo leaving its users to cough up for the privilege of accessing their mail. Understandable, when competing against rivals such as Gmail and Hotmail who hold a large majority of users and were hacked in 2014 as well.
Incoming Mail (IMAP) Server
* Server - imap.mail.yahoo.com
* Port - 993
* Requires SSL - Yes
Outgoing Mail (SMTP) Server
* Server - smtp.mail.yahoo.com
* Port - 465 or 587
* Requires SSL - Yes
* Requires authentication - Yes
Your login info
* Email address - Your full email address (name@domain.com)
* Password - Your account's password
* Requires authentication - Yes
Note that you need to enable “Web & POP Access” in your Yahoo Mail account to send and receive Yahoo Mail messages through any other email program.
You will have to enable “Allow your Yahoo Mail to be POPed” under “POP and Forwarding”, to send and receive Yahoo mails through any other email client.
Cannot be done since 2002 unless the customer pays Yahoo a subscription subs fee to have access to SMTP and POP3
* Set the POP server for incoming mails as pop.mail.yahoo.com. You will have to enable “SSL” and use 995 for Port.
* “Account Name or Login Name” – Your Yahoo Mail ID i.e. your email address without the domain “@yahoo.com”.
* “Email Address” – Your Yahoo Mail address i.e. your email address including the domain “@yahoo.com”. E.g. myname@yahoo.com
* “Password” – Your Yahoo Mail password.
Yahoo! Mail Plus users may have to set POP server as plus.pop.mail.yahoo.com and SMTP server as plus.smtp.mail.yahoo.com.
* Set the SMTP server for outgoing mails as smtp.mail.yahoo.com. You will also have to make sure that “SSL” is enabled and use 465 for port. you must also enable “authentication” for this to work.
====YAM Yet Another Mailer====
YAM does not support SSL and most mail providers have now switched to encrypted SMTP/POP3 connections
This email client is POP3 only if the SSL library is available [http://www.freelists.org/list/yam YAM Freelists]
One of the downsides of using a POP3 mailer unfortunately - you have to set an option not to delete the mail if you want it left on the server. IMAP keeps all the emails on the server.
Possible issues
Sending mail issues is probably a matter of using your ISP's SMTP server, though it could also be an SSL issue.
getting a "Couldn't initialise TLSv1 / SSL error
Use of on-line e-mail accounts with this email client is not possible as it lacks the OpenSSL AmiSSl v3 compatible library
GMail
Incoming Mail (POP3) Server - requires SSL: pop.gmail.com
Use SSL: Yes
Port: 995
Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes
Use STARTTLS: Yes (some clients call this SSL)
Port: 465 or 587
Account Name: your Gmail username (including '@gmail.com')
Email Address: your full Gmail email address (username@gmail.com)
Password: your Gmail password
Anyway, the SMTP is pop.gmail.com port 465 and it uses SSLLv3 Authentication. The POP3 settings are for the same server (pop.gmail.com), only on port 995 instead.
Outlook.com access
<pre >
Outlook.com SMTP server address: smtp.live.com
Outlook.com SMTP user name: Your full Outlook.com email address (not an alias)
Outlook.com SMTP password: Your Outlook.com password
Outlook.com SMTP port: 587
Outlook.com SMTP TLS/SSL encryption required: yes
</pre >
Yahoo Mail
<pre >
“POP3 Server” – Set the POP server for incoming mails as pop.mail.yahoo.com. You will have to enable “SSL” and use 995 for Port.
“SMTP Server” – Set the SMTP server for outgoing mails as smtp.mail.yahoo.com. You will also have to make sure that “SSL” is enabled and use 465 for port. you must also enable “authentication” for this to work.
“Account Name or Login Name” – Your Yahoo Mail ID i.e. your email address without the domain “@yahoo.com”.
“Email Address” – Your Yahoo Mail address i.e. your email address including the domain “@yahoo.com”. E.g. myname@yahoo.com
“Password” – Your Yahoo Mail password.
</pre >
Yahoo! Mail Plus users may have to set POP server as plus.pop.mail.yahoo.com and SMTP server as plus.smtp.mail.yahoo.com.
Note that you need to enable “Web & POP Access” in your Yahoo Mail account to send and receive Yahoo Mail messages through any other email program.
You will have to enable “Allow your Yahoo Mail to be POPed” under “POP and Forwarding”, to send and receive Yahoo mails through any other email client.
Cannot be done since 2002 unless the customer pays Yahoo a monthly fee to have access to SMTP and POP3
Microsoft Outlook Express Mail
1. Get the files to your PC.
By whatever method get the files off your Amiga onto your PC. In the YAM folder you have a number of different folders, one for each of your folders in YAM. Inside that is a file usually some numbers such as 332423.283. YAM created a new file for every single email you received.
2. Open up a brand new Outlook Express. Just configure the account to use 127.0.0.1 as mail servers. It doesn't really matter. You will need to manually create any subfolders you used in YAM.
3. You will need to do a mass rename on all your email files from YAM. Just add a .eml to the end of it. Amazing how PCs still rely mostly on the file name so it knows what sort of file it is rather than just looking at it! There are a number of multiple renamers online to download and free too.
4. Go into each of your folders, inbox, sent items etc. And do a select all then drag the files into Outlook Express (to the relevant folder obviously) Amazingly the file format that YAM used is very compatible with .eml standard and viola your emails appear. With correct dates and working attachments.
5. If you want your email into Microsoft Outlook. Open that up and create a new profile and a new blank PST file. Then go into File Import and choose to import from Outlook Express. And the mail will go into there. And viola.. you have your old email from your Amiga in a more modern day format.
===FTP===
Magellan has a great FTP module. It allows transferring files from/to a FTP server over the Internet or the local network and, even if FTP is perceived as a "thing of the past", its usability is all inside the client. The FTP thing has a nice side effect too, since every Icaros machine can be a FTP server as well, and our files can be easily transferred from an Icaros machine to another with a little configuration effort.
First of all, we need to know the 'server' IP address. Server is the Icaros machine with the file we are about to download on another Icaros machine, that we're going to call 'client'. To do that, move on the server machine and 1) run Prefs/Services to be sure "FTP file transfer" is enabled (if not, enable it and restart Icaros); 2) run a shell and enter this command:
ifconfig -a
Make a note of the IP address for the network interface used by the local area network. For cabled devices, it usually is net0:. Now go on the client machine and run Magellan:
Perform these actions: 1) click on FTP; 2) click on ADDRESS BOOK; 3) click on "New".
You can now add a new entry for your Icaros server machine:
1) Choose a name for your server, in order to spot it immediately in the address book. Enter the IP address you got before.
2) click on Custom Options:
1) go to Miscellaneous in the left menu;
2) Ensure "Passive Transfers" is NOT selected;
3) click on Use. We need to deactivate Passive Transfers because YAFS, the FTP server included in Icaros, only allows active transfers at the current stage. Now, we can finally connect to our new file source:
1) Look into the address book for the newly introduced server, be sure that name and IP address are right, and
2) click on Connect. A new lister with server's "MyWorkspace" contents will appear. You can now transfer files over the network choosing a destination among your local (client's) volumes.
Can be adapted to any FTP client on any platform of your choice, just be sure your client allows Active Transfers as well.
===IRC Internet Relay Chat===
Jabberwocky is ideal for one-to-one social media communication, use IRC if you require one to many.
Just type a message in ''lowercase''' letters and it will be posted to all in the [ AROS irc channel]. Please do not use UPPER CASE as it is a sign of SHOUTING which is annoying.
Other things to type in - replace <message> with a line of text and <nick> with a person's name
<pre>
/help
/list
/who
/whois <nick>
/msg <nick> <message>
/query <nick>
<message>s
/query
/away <message>
/away
/quit <going away message>
</pre>
[http://irchelp.org/irchelp/new2irc.html#smiley Intro guide here]. IRC Primer can be found here in [http://www.irchelp.org/irchelp/ircprimer.html html], [http://www.irchelp.org/irchelp/text/ircprimer.txt TXT], [http://www.kei.com/irc/IRCprimer1.1.ps PostScript].
Issue the command /me <text> where <text> is the text that should follow your nickname.
Example: /me slaps ajk around a bit with a large trout
/nick <newNick>
/nickserv register <password> <email address>
/ns instead of /nickserv, while others might need /msg nickserv
/nickserv identify <password>
Alternatives:
/ns identify <password>
/msg nickserv identify <password>
==== IRC WookieChat ====
WookieChat is the most complete internet client for communication across the IRC Network. WookieChat allows you to swap ideas and communicate in real-time, you can also exchange Files, Documents, Images and everything else using the application's DCC capabilities.
add smilies drawer/directory
run wookiechat from the shell and set stack to 1000000 e.g. wookiechat stack 1000000
select a server / server window
* nickname
* user name
* real name - optional
Once you configure the client with your preferred screen name, you'll want to find a channel to talk in.
servers
* New Server - click on this to add / add extra - change details in section below this click box
* New Group
* Delete Entry
* Connect to server
* connect in new tab
* perform on connect
Change details
* Servername - change text in this box to one of the below Server:
* Port number - no need to change
* Server password
* Channel - add #channel from below
* auto join - can click this
* nick registration password,
Click Connect to server button above
<pre>
Server: irc.freenode.net
Channel: #aros
</pre>
irc://irc.freenode.net/aros
<pre>
Server: chat.amigaworld.net
Channel: #amigaworld or #amigans
</pre>
<pre>
On Sunday evenings USA time usually starting around 3PM EDT (1900 UTC)
Server:irc.superhosts.net
Channel #team*amiga
</pre>
<pre>
BitlBee and Minbif are IRCd-like gateways to multiple IM networks
Server: im.bitlbee.org
Port 6667
Seems to be most useful on WookieChat as you can be connected to several servers at once. One for Bitlbee and any messages that might come through that. One for your normal IRC chat server.
</pre>
[http://www.bitlbee.org/main.php/servers.html Other servers],
<pre>
#Amiga.org - irc.synirc.net eu.synirc.net dissonance.nl.eu.synirc.net (IPv6: 2002:5511:1356:0:216:17ff:fe84:68a)
twilight.de.eu.synirc.net zero.dk.eu.synirc.net us.synirc.net avarice.az.us.synirc.net envy.il.us.synirc.net harpy.mi.us.synirc.net
liberty.nj.us.synirc.net snowball.mo.us.synirc.net - Ports 6660-6669 7001 (SSL)
</pre>
<pre>
Multiple server support
"Perform on connect" scripts and channel auto-joins
Automatic Nickserv login
Tabs for channels and private conversations
CTCP PING, TIME, VERSION, SOUND
Incoming and Outgoing DCC SEND file transfers
Colours for different events
Logging and automatic reloading of logs
mIRC colour code filters
Configurable timestamps
GUI for changing channel modes easily
Configurable highlight keywords
URL Grabber window
Optional outgoing swear word filter
Event sounds for tabs opening, highlighted words, and private messages
DCC CHAT support
Doubleclickable URL's
Support for multiple languages using LOCALE
Clone detection
Auto reconnection to Servers upon disconnection
Command aliases
Chat display can be toggled between AmIRC and mIRC style
Counter for Unread messages
Graphical nicklist and graphical smileys with a popup chooser
</pre>
====IRC Aircos ====
Double click on Aircos icon in Extras:Networking/Apps/Aircos. It has been set up with a guest account for trial purposes. Though ideally, choose a nickname and password for frequent use of irc.
====IRC and XMPP Jabberwocky====
Servers are setup and close down at random
You sign up to a server that someone else has setup and access chat services through them.
The two ways to access chat from jabberwocky
<pre >
Jabberwocky -> Server -> XMPP -> open and ad-free
Jabberwocky -> Server -> Transports (Gateways) -> Proprietary closed systems
</pre >
The Jabber.org service connects with all IM services that use XMPP, the open standard for instant messaging and presence over the Internet. The services we connect with include Google Talk (closed), Live Journal Talk, Nimbuzz, Ovi, and thousands more. However, you can not connect from Jabber.org to proprietary services like AIM, ICQ, MSN, Skype, or Yahoo because they don’t yet use XMPP components (XEP-0114) '''but''' you can use Jabber.com's servers and IM gateways (MSN, ICQ, Yahoo etc.) instead.
The best way to use jabberwocky is in conjunction with a public jabber server with '''transports''' to your favorite services, like gtalk, Facebook, yahoo, ICQ, AIM, etc.
You have to register with one of the servers, [https://list.jabber.at/ this list] or [http://www.jabberes.org/servers/ another list], [http://xmpp.net/ this security XMPP list],
Unfortunately jabberwocky can only connect to one server at a time so it is best to check what services each server offers. If you set it up with separate Facebook and google talk accounts, for example, sometimes you'll only get one or the other.
Jabberwocky open a window where the Jabber server part is typed in as well as your Nickname and Password.
Jabber ID (JID) identifies you to the server and other users.
Once registered the next step is to goto Jabberwocky's "Windows" menu and select the "Agents" option. The "Agents List" window will open.
Roster (contacts list)
[http://search.wensley.org.uk/ Chatrooms] (MUC) are available
File Transfer - can send and receive files through the Jabber service but not with other services like IRC, ICQ, AIM or Yahoo. All you need is an installed webbrowser and OpenURL.
Clickable URLs - The message window uses Mailtext.mcc and you can set a URL action in the MUI mailtext prefs like SYS:Utils/OpenURL %s NEWWIN.
There is no consistent Skype like (H.323 VoIP) video conferencing available over Jabber. The move from xmpp to Jingle should help but no support on any amiga-like systems at the moment. [http://aminet.net/package/dev/src/AmiPhoneSrc192 AmiPhone] and [http://www.lysator.liu.se/%28frame,faq,nobg,useframes%29/ahi/v4-site/ Speak Freely] was an early attempt voice only contact. SIP and Asterisk are other PBX options.
Facebook
If you're using the XMPP transport provided by Facebook themselves, chat.facebook.com, it looks like they're now requiring SSL transport. This means jabberwocky method below will no longer work. The best thing to do is to create an ID on a public jabber server which has a Facebook gateway.
<pre >
1. launch jabberwocky
2. if the login window doesn't appear on launch, select 'account' from the jabberwocky menu
3. your jabber ID will be user@chat.facebook.com where user is your user ID
4. your password is your normal facebook password
5. to save this for next time, click the popup gadget next to the ID field
6. click the 'add' button
7. click the 'close' button
8. click the 'connect' button
</pre >
you're done. you can also click the 'save as default account' button if you want. jabberwocky configured to auto-connect when launching the program, but you can configure as you like. there is amigaguide documentation included with jabberwocky.
[http://amigaworld.net/modules/newbb/viewtopic.php?topic_id=37085&forum=32 Read more here]
for Facebook users, you can log-in directly to Facebook with jabberwocky. just sign in as @chat.facebook.com with your Facebook password as the password
Twitter
For a few years, there has been added a twitter transport. Servers include [http://jabber.hot-chilli.net/ jabber.hot-chili.net], and .
An [http://jabber.hot-chilli.net/tag/how-tos/ How-to]
:Read [http://jabber.hot-chilli.net/2010/05/09/twitter-transport-working/ more]
Instagram
no support at the moment best to use a web browser based client
ICQ
The new version (beta) of StriCQ uses a newer ICQ protocol. Most of the ICQ Jabber Transports still use an older ICQ protocol. You can only talk one-way to StriCQ using the older Transports. Only the newer ICQv7 Transport lets you talk both ways to StriCQ. Look at the server lists in the first section to check.
Register on a Jabber server, e.g. this one works: http://www.jabber.de/
Then login into Jabberwocky with the following login data e.g. xxx@jabber.de / Password: xxx Now add your ICQ account under the window->Agents->"Register". Now Jabberwocky connects via the Jabber.de server with your ICQ account.
Yahoo Messenger
although yahoo! does not use xmpp protocol, you should be able to use the transport methods to gain access and post your replies
MSN
early months of 2013 Microsoft will ditch MSN Messenger client and force everyone to use Skype...but MSN protocol and servers will keep working as usual for quite a long time....
Occasionally the Messenger servers have been experiencing problems signing in. You may need to sign in at www.outlook.com and then try again. It may also take multiple tries to sign in. (This also affects you if you’re using Skype.)
You have to check each servers' Agents List to see what transports (MSN protocol, ICQ protocol, etc.) are supported or use the list address' provided in the section above. Then register with each transport (IRC, MSN, ICQ, etc.) to which you need access. After registering you can Connect to start chatting.
msn.jabber.com/registered should appear in the window.
From this [http://tech.dir.groups.yahoo.com/group/amiga-jabberwocky/message/1378 JW group] guide which helps with this process in a clear, step by step procedure.
1. Sign up on MSN's site for a passport account. This typically involves getting a Hotmail address.
2. Log on to the Jabber server of your choice and do the following:
* Select the "Windows/Agents" menu option in Jabberwocky.
* Select the MSN Agent from the list presented by the server.
* Click the Register button to open a new window asking for:
**Username = passort account email address, typically your hotmail address.
**Nick = Screen name to be shown to anyone you add to your buddy list.
**Password = Password for your passport account/hotmail address.
* Click the Register button at the bottom of the new window.
3. If all goes well, you will see the MSN Gateway added to your buddy list. If not, repeat part 2 on another server. Some servers may show MSN in their list of available agents, but have not updated their software for the latest protocols used by MSN.
4. Once you are registered, you can now add people to your buddy list. Note that you need to include the '''msn.''' ahead of the servername so that it knows what gateway agent to use. Some servers may use a slight variation and require '''msg.gate.''' before the server name, so try both to see what works.
If my friend's msn was amiga@hotmail.co.uk and my jabber server was @jabber.meta.net.nz..
then amiga'''%'''hotmail.com@'''msn.'''jabber.meta.net.nz
or another the trick to import MSN contacts is that you don't type the hotmail URL but the passport URL... e.g. Instead of: goodvibe%hotmail.com@msn.jabber.com You type: goodvibe%passport.com@msn.jabber.com
And the thing about importing contacts I'm afraid you'll have to do it by hand, one at the time...
Google Talk
any XMPP server will work, but you have to add your contacts manually. a google talk user is typically either @gmail.com or @talk.google.com. a true gtalk transport is nice because it brings your contacts to you and (can) also support file transfers to/from google talk users.
implement Jingle a set of extensions to the IETF's Extensible Messaging and Presence Protocol (XMPP)
support ended early 2014 as Google moved to Google+ Hangouts which uses it own proprietary format
===Video Player MPlayer===
Many of the menu features (such as doubling) do not work with the current version of mplayer but using
4:3
mplayer -vf scale=800:600 file.avi
16:9
mplayer -vf scale=854:480 file.avi
if you want gui use;
mplayer -gui 1 <other params> file.avi
<pre >
stack 1000000
; using AspireOS 1.xx
; copy FROM SYS:Extras/Multimedia/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
; using Icaros Desktop 1.x
; copy FROM SYS:Tools/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
; using Icaros Desktop 2.x
; copy FROM SYS:Utilities/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
cd RAM:MPlayer
run MPlayer -gui > Nil:
;run MPlayer -gui -ao ahi_dev -playlist http://www.radio-paralax.de/listen.pls > Nil:
</pre >
$ mplayer rtsp://127.0.0.1:554/sample_300kbit.mp4
MPlayer supports multicast streaming, and rtp/rtsp protocols (it might require [http://www.live555.com/openRTSP/ live555 library] to work with some streams). But you might have to build it where it's disabled. Also, multicast won't work with some AmiTCP-likes. MIAMI supported it, though.
AROS supports IPv4 (old but works) and this includes the needed address space for RTP.
If you mean multicast via RTP - mplayer handles it. You can even force UDP over TCP
-rtsp-stream-over-tcp
If the rtsp Real Time Streaming Protocol server needs authentification:
-user -passwd
MPlayer - Menu - Open Playlist and load already downloaded .pls or .m3u file - auto starts around 4 percent cache
MPlayer - Menu - Open Stream and copy one of the .pls lines below into space allowed, press OK and press play button on main gui interface
Old 8bit 16bit remixes chip tune game music
http://www.radio-paralax.de/listen.pls
http://scenesat.com/
http://www.shoutcast.com/radio/Amiga
http://www.theoldcomputer.com/retro_radio/RetroRadio_Main.htm
http://www.kohina.com/
http://www.remix64.com/
http://retrogamer.net/forum/
http://retroasylum.podomatic.com/rss2.xml
http://retrogamesquad.com/
http://www.retronauts.com/
http://monsterfeet.com/noquarter/
http://www.retrogamingradio.com/
http://www.radiofeeds.co.uk/mp3.asp
[[#top|...to the top]]
====ZunePaint====
simplified typical workflow
* importing and organizing and photo management
* making global and regional local correction(s) - recalculation is necessary after each adjustment as it is not in real-time
* exporting your images in the best format available with the preservation of metadata
Whilst achieving 80% of a great photo with just a filter, the remaining 20% comes from a manual fine-tuning of specific image attributes.
For photojournalism, documentary, and event coverage, minimal touching is recommended. Stick to Camera Raw for such shots, and limit changes to level adjustment, sharpness, noise reduction, and white balance correction.
For fashion or portrait shoots, a large amount of adjustment is allowed and usually ends up far from the original. Skin smoothing, blemish removal, eye touch-ups, etc. are common. Might alter the background a bit to emphasize the subject.
Product photography usually requires a lot of sharpening, spot removal, and focus stacking.
For landscape shots, best results are achieved by doing the maximum amount of preparation before/while taking the shot. No amount of processing can match timing, proper lighting, correct gear, optimal settings, etc. Excessive post-processing might give you a dramatic shot but best avoided in the long term.
* White Balance - Left Amiga or F12 and K and under "Misc color effects" tab with a pull down for White Balance - color temperature also known as AKA tint (movies) or tones (painting) - warm temp raise red reduce green blue - cool raise blue lower red green
* Exposure - exposure compensation, highlight/shadow recovery
* Noise Reduction - during RAW development or using external software
* Lens Corrections - distortion, vignetting, chromatic aberrations
* Detail - capture sharpening and local contrast enhancement
* Contrast - black point, levels (sliders) and curves tools (F12 and K)
* Framing - straighten () and crop (F12 and F)
* Refinements - color adjustments and selective enhancements - Left Amiga or F12 and K for RGB and YUV histogram tabs -
* Resizing - enlarge for a print or downsize for the web or email (F12 and D)
* Output Sharpening - customized for your subject matter and print/screen size
White Balance - F12 and K
scan your image for a shade which was meant to be white (neutral with each RGB value being equal) like paper or plastic which is in the same light as the subject of the picture. Use the dropper tool to select this color, similar colours will shift and you will have selected the perfect white balance for your part of the image - for the whole picture make sure RAZ or CLR button at the bottom is pressed before applying to the image above.
Exposure correction
F12 and K - YUV Y luminosity - RGB extra red tint - move red curve slightly down and move blue green curves slightly up
Workflows in practice
* Undo - Right AROS key or F12 and Z
* Redo - Right AROS key or F12 and R
First flatten your image (if necessary) and then do a rotation until the picture looks level.
* Crop the picture. Click the selection button and drag a box over the area of the picture you want to keep. Press the crop button and the rest of the photo will be gone.
* Adjust your saturation, exposure, hue levels, etc., (right AROS Key and K for color correction) until you are happy with the photo. Make sure you zoom in all of the way to 100% and look the photo over, zoom back out and move around. Look for obvious problems with the picture.
* After coloring and exposure do a sharpen (Right AROS key and E for Convolution and select drop down option needed), e.g. set the matrix to 5x5 (roughly equivalent Amount to 60%) and set the Radius to 1.0. Click OK.
And save your picture
Implemented or would like to see for simplification and ease of use
basic filters (presets) like black and white, monochrome, edge detection (sobel), motion/gaussian blur,
* negative, sepiatone, retro vintage, night vision, colour tint, color gradient, color temperature, glows, fire, lightning, lens flare, emboss, filmic, pixelate mezzotint, antialias, etc.
adjust / cosmetic tools such as crop,
* reshaping tools, straighten, smear, smooth, perspective, liquify, bloat, pucker, push pixels in any direction, dispersion, transform like warp, blending with soft light, page-curl, whirl, ripple, fisheye, neon, etc.
* red eye fixing, blemish remover, skin smoothing, teeth whitener, make eyes look brighter, desaturate,
effects like oil paint, cartoon, pencil sketch, charcoal, noise/matrix like sharpen/unsharpen, (right AROS key with A for Artistic effects)
* blend two image, gradient blend, masking blend, explode, implode, custom collage, surreal painting, comic book style, needlepoint, stained glass, watercolor, mosaic, stencil/outline, crayon, chalk, etc.
borders such as
* dropshadow, rounded, blurred, color tint, picture frame, film strip polaroid, bevelled edge, etc.
brushes e.g.
* frost, smoke, etc.
and manual control of
fix lens issues including vignetting (darkening), color fringing and barrel distortion, and chromatic and geometric aberration - lens and body profiles
perspective correction
levels - directly modify the levels of the tone-values of an image, by using sliders for highlights, midtones and shadows
curves - Color Adjustment and Brightness/Contrast
color balance
one single color transparent (alpha channel (color information/selections) for masking and/or blending ) for backgrounds, etc.
Threshold indicates how much other colors will be considered mixture of the removed color and non-removed colors
decompose layer into a set of layers with each holding a different type of pattern that is visible within the image
any selection using any selecting tools like lasso tool, marquee tool etc. the selection will temporarily be save to alpha
If you create your image without transparency then the Alpha channel is not present, but you can add later.
File formats like .psd (Photoshop file has layers, masks etc. contains edited sensor data. The original sensor data is no longer available) .xcf .raw .hdr
Image Picture Formats
* low dynamic range (JPEG, PNG, TIFF 8-bit), 16-bit (PPM, TIFF), typically as a 16-bit TIFF in either ProPhoto or AdobeRGB colorspace - TIFF files are also fairly universal – although, if they contain proprietary data, such as Photoshop Adjustment Layers or Smart Filters, then they can only be opened by Photoshop making them proprietary.
* linear high dynamic range (HDR) images (PFM, [http://www.openexr.com/ ILM .EXR], jpg, [http://aminet.net/util/dtype cr2] (canon tiff based), hdr, NEF, CRW, ARW, MRW, ORF, RAF (Fuji), PEF, DCR, SRF, ERF, DNG files are RAW converted to an Adobe proprietary format - a container that can embed the raw file as well as the information needed to open it)
An old version of [http://archives.aros-exec.org/index.php?function=browse&cat=graphics/convert dcraw]
There is no single RAW file format. Each camera manufacturer has one or more unique RAW formats. RAW files contain the brightness levels data captured by the camera sensor. This data cannot be modified. A second smaller file, separate XML file, or within a database with instructions for the RAW processor to change exposure, saturation etc. The extra data can be changed but the original sensor data is still there. RAW is technically least compatible.
A raw file is high-bit (usually 12 or 14 bits of information) but a camera-generated TIFF file will be usually converted by the camera (compressed, downsampled) to 8 bits. The raw file has no embedded color balance or color space, but the TIFF has both. These three things (smaller bit depth, embedded color balance, and embedded color space) make it so that the TIFF will lose quality more quickly with image adjustments than the raw file. The camera-generated TIFF image is much more like a camera processed JPEG than a raw file. A strong advantage goes to the raw file. The power of RAW files, such as the ability to set any color temperature non-destructively and will contain more tonal values.
The principle of preserving the maximum amount of information to as late as possible in the process. The final conversion - which will always effectively represent a "downsampling" - should prevent as much loss as possible.
Once you save it as TIFF, you throw away some of that data irretrievably. When saving in the lossy JPEG format, you get tremendous file size savings, but you've irreversibly thrown away a lot of image data. As long as you have the RAW file, original or otherwise, you have access to all of the image data as captured.
Keyboard equivalence with Photoshop(tm) would help
File
PHOTOSHOP SHORTCUT GIMP
New Ctrl+n New
Open Ctrl+o Open
Close Ctrl+w Close
Save Ctrl+s Save
Save as Shift+Ctrl+s Save as
Revert F12 Revert
Print Ctrl+p Print
Exit Ctrl+q Quit
Edit
PHOTOSHOP SHORTCUT GIMP
Undo/Redo (1 level) Ctrl+z Undo (Redo is Shift+Ctrl+z)
Cut Ctrl+x Cut
Copy Ctrl+c Copy
Paste Ctrl+v Paste
Paste Into Shift+Ctrl+v Paste Into
Fill with FG color Alt+Backspace Fill with FG color
Fill with BG color Control+Backspace Fill with BG color
Image/Colors
PHOTOSHOP SHORTCUT GIMP
Levels Ctrl+l Levels
Auto Contrast Shift+Ctrl+Alt+l Stretch Contrast (same?)
Curves Ctrl+m Curves
Color Balance Ctrl+b Color Balance
Hue/Saturation Ctrl+u Hue-Saturation
Desaturate Shift+Ctrl+u Desaturate
Invert Ctrl+i Invert
Default Colors d Default Colors
Switch Colors x Switch Colors
Layer
PHOTOSHOP SHORTCUT GIMP
New Layer Shift+Ctrl+n New Layer
Layer via Copy Ctrl+j Duplicate Layer
Bring (layer) to Front Shift+Ctrl+] Layer to Top
Send (layer) to Back Shift+Ctrl+[ Layer to Bottom
Bring (layer) Forward Ctrl+] Raise Layer
Send (layer) Backward Ctrl+[ Lower Layer
Select Top Layer Shift+Alt+] Select Top Layer
Select Bottom Layer Shift+Alt+[ Select Bottom Layer
Select One Layer Forward Alt+] Select Previous Layer
Select One Layer Backward Alt+[ Select Next Layer
Merge Down Ctrl+e Merge Down
Merge Visible Shift+Ctrl+e Merge Visible
Preserve Transparency / Keep Transparency
Cycle Modes Forwards Shift+= Next Layer Mode
Cycle Modes Backwards Shift+- Previous Layer Mode
Select
PHOTOSHOP SHORTCUT GIMP
Select All Ctrl+a Select All
Deselect Ctrl+d Select None
Inverse Shift+Ctrl+i Invert
Feather Ctrl+Alt+d Feather
View
PHOTOSHOP SHORTCUT GIMP
Zoom In Ctrl+= Zoom In
Zoom Out Ctrl+- Zoom Out
Fit on Screen Ctrl+0 Zoom to Fit Window
Actual Pixels Ctrl+Alt+0 Zoom 1:1
Show/Hide Extras Ctrl+h Toggle Show Selection (close enough?)
Show/Hide Guides Ctrl+' Toggle Show Guides
Show/Hide Grid Ctrl+Alt+' Toggle Show Grid
Show/Hide Rulers Ctrl+r Toggle Show Rulers
Snap Ctrl+; Snap to Guides
Scroll View Up Page Up Scroll Page Up
Scroll View Down Page Down Scroll Page Down
Scroll View Left Ctrl+Page Up Scroll Page Left
Scroll View Right Ctrl+Page Down Scroll Page Right
Window/Dialogs
PHOTOSHOP SHORTCUT GIMP
? F5 Tools Dialog
Color Tab F6 Colors Dialog
Layers Tab F7 Layers Dialog
Info Tab F8 Image Information
Tools
PHOTOSHOP SHORTCUT GIMP
Rectangular Marquee Tool m Rect Select Tool
Elliptical Marquee Tool Shift+m Ellipse Select Tool
*This is a toggle between 'Elliptical Marquee Tool' and 'Rectangular Marquee Tool' in Photoshop
Move Tool v Move Tool
Lasso Tool l Free Select Tool
Magic Wand Tool w Fuzzy Select Tool
Crop Tool c Crop & Resize Tool
Airbrush Tool j Airbrush Tool
Paintbrush Tool b Paintbrush Tool
Clone Stamp Tool s Clone Stamp Tool
Eraser Tool e Eraser Tool
Gradient Tool g Blend Tool
Paint Bucket Tool Shift+g Bucket Fill Tool
*This is a toggle between 'Paint Bucket Tool' and 'Gradient Tool' in Photoshop
Blur Tool r Convolve Tool
Dodge Tool o DodgeBurn Tool
Type Tool t Text Tool
Pen Tool p Bezier Select Tool
Eye Dropper Tool i Color Picker Tool
Zoom Tool z Magnify Tool
Previous Brush , Previous Brush
Next Brush . Next Brush
First Brush Shift+< First Brush
Last Brush Shift+> Last Brush
Decrease Brush Size [ Decrease Brush Size
Increase Brush Size ] Increase Brush Size
Decrease Brush Hardness { Decrease Brush Hardness
Increase Brush Hardness } Increase Brush Hardness
Help
PHOTOSHOP SHORTCUT GIMP
Help F1 Help
Context Help Shift+F1 Context Help
Misc.
PHOTOSHOP SHORTCUT GIMP
Last Filter Ctrl+f Repeat Last Filter
? Shift+Ctrl+f Reshow Last Filter
Preferences Ctrl+k Preferences
Liquify Shift+Ctrl+x IWarp (close enough?)
Toggle Quick Mask q Toggle Quick Mask
Spotlights - triangle of white opaque shape
Cutting out and/or replacing unwanted background or features - select large areas with the selection option like the Magic Wand tool (aka Color Range) or the Lasso (quick and fast) with feather 2 to soften edge or the pen tool which adds points/lines/Bézier curves (better control but slower), hold down the shift button as you click to add extra points/areas of the subject matter to remove. Increase the tolerance to cover more areas. To subtract from your selection hold down alt as you're clicking.
* Layer masks are a better way of working than Erase they clip (black hides/hidden white visible/reveal). Clone Stamp can be simulated by and brushes for other areas.
* Leave the fine details like hair, fur, etc. to later with lasso and the shift key to draw a line all the way around your subject. Gradient Mapping - Inverse - Mask. i.e. Refine your selected image with edge detection and using the radius and edge options / adjuster (increase/decrease contrast) so that you will capture more fine detail from the background allowing easier removal.
Remove fringe/halo
saving image as png rather than jpg/jpeg to keep transparency background intact.
Implemented [http://colorizer.org/ colour model representations] [http://paulbourke.net/texture_colour/colourspace/ Mathematical approach] - Photo stills are spatially 2d (h and w), but are colorimetrically 3d (r g and b, or H L S, or Y U V etc.) as well.
* RGB - split cubed mapped color model for photos and computer graphics hardware using the light spectrum (adding and subtracting)
* YUV - Y-Lightness U-blue/yellow V-red/cyan (similar to YPbPr and YCbCr) used in the PAL, NTSC, and SECAM composite digital TV color [http://crewofone.com/2012/chroma-subsampling-and-transcoding/#comment-7299 video]
Histograms
White balanced (neutral) if the spike happens in the same place in each channel of the RGB graphs. If not, you're not balanced.
If you have sky you'll see the blue channel further off to the right.
RGB is best one to change colours. These elements RGB is a 3-channel format containing data for Red, Green, and Blue in your photo scale between 0 and 255. The area in a picture that appears to be brighter/whiter contains more red color as compared to the area which is relatively darker. Similarly in the green channel the area that appears to be darker contains less amount of green color as compared to the area that appears to be brighter. Similarly in the blue channel the area appears to be darker contains less amount of blue color as compared to the area that appears to be brighter. Brightness luminance histogram also matches the green histogram more than any other color - human eye interprets green better e.g. RGB rough ratio 15/55/30%
RGBA (RGB+A, A means alpha channel) . The alpha channel is used for "alpha compositing", which can mostly be associated as "opacity". AROS deals in RGB with two digits for every color (red, green, blue), in ARGB you have two additional hex digits for the alpha channel.
The shadows are represented by the left third of the graph. The highlights are represented by the right third. And the midtones are, of course, in the middle. The higher the black peaks in the graph, the more pixels are concentrated in that tonal range (total black area).
By moving the black endpoint, which identifies the shadows (darkness) and a white light endpoint (brightness) up and down either sides of the graph, colors are adjusted based on these points.
By dragging the central one, can increased the midtones and control the contrast, raise shadows levels, clip or softly eliminate unsafe levels, alter gamma, etc... in a way that is much more precise and creative .
RGB Curves
* Move left endpoint (black point) up or right endpoint (white point) up brightens
* Move left endpoint down or right endpoint down darkens
Color Curves
* Dragging up on the Red Curve increases the intensity of the reds in the image but
* Dragging down on the Red Curve decreases the intensity of the reds and thus increases the apparent intensity of its complimentary color, cyan. Green’s complimentary color is magenta, and blue’s is yellow.
<pre>
Red <-> Cyan
Green <->Magenta
Blue <->Yellow
</pre>
YUV Best option to analyse and pull out statistical elements of any picture (i.e. separate luminance data from color data). The line in Y luma tone box represents the brightness of the image with the point in the bottom left been black, and the point in the top right as white. A low-contrast image has a concentrated clump of values nearer to the center of the graph. By comparison, a high-contrast image has a wider distribution of values across the entire width of the Histogram. A histogram that is skewed to the right would indicate a picture that is a bit overexposed because most of the color data is on the lighter side (increase exposure with higher value F), while a histogram with the curve on the left shows a picture that is underexposed. This is good information to have when using post-processing software because it shows you not only where the color data exists for a given picture, but also where any data has been clipped (extremes on edges of either side): that is, it does not exist and, therefore, cannot be edited. By dragging the endpoints of the line and as well as the central one, can increased the dark/shadows, midtones and light/bright parts and control the contrast, raise shadows levels, clip or softly eliminate unsafe levels, alter gamma, etc... in a way that is much more precise and creative .
The U and V chroma parts show color difference components of the image. It’s useful for checking whether or not the overall chroma is too high, and also whether it’s being limited too much
Can be used to create a negative image but also
With U (Cb), the higher value you are, the more you're on the blue primary color. If you go to the low values then you're on blue complementary color, i.e. yellow.
With V (Cr), this is the same principle but with Red and Cyan.
e.g. If you push U full blue and V full red, you get magenta. If you push U full yellow and V full Cyan then you get green.
YUV simultaneously adds to one side of the color equation while subtracting from the other.
using YUV to do color correction can be very problematic because each curve alters the result of each other: the mutual influence between U and V often makes things tricky. You may also be careful in what you do to avoid the raise of noise (which happens very easily). Best results are obtained with little adjustments
sunset that looks uninspiring and needs some color pop especially for the rays over the hill, a subtle contrast raise while setting luma values back to the legal range without hard clipping.
====Lunapaint====
Pixel based drawing app with onion-skin animation function
Blocking, Shading, Coloring, adding detail
<pre>
b BRUSH
e ERASER
alt eyedropper
v layer tool
z ZOOM / MAGNIFY < > n
spc panning
m marque
q lasso
w same color selection / region
</pre>
<pre>
, LM RM
v
V
f filter
F
. size
p
, pick color
[] last / next color
</pre>
There is not much missing in Lunapaint to be as good as FlipBook and then you have to take into account that Flipbook is considered to be amongst the best and easiest to use animation software out there. Ok to be honest Flipbook has some nice features that require more heavy work but those aren't so much needed right away, things like camera effects, sound, smart fill, export to different movie file formats etc.
Tried Flipbook with my tablet and compared it to Luna. The feeling is the same when sketching. LunaPaint is very responsive/fluent to draw with. Just as Flipbook is, and that responsiveness is something its users have mentioned as one of the positive sides of said software.
author was learning MUI. Some parts just have to be rewritten with proper MUI classes before new features can be added.
* add [Frame Add] / [Frame Del]
* whole animation feature is impossible to use. If you draw 2 color maybe but if you start coloring your cells then you get in trouble
* pickup the entire image as a brush, not just a selection ? And consequently remove the brush from memory when one doesn't need it anymore. can pick up a brush and put it onto a new image but cropping isn't possible, nor to load/save brushes.
* Undo is something I longed for ages in Lunapaint.
* to import into the current layer, other types of images (e.g. JPEG) besides RAW64.
* implement graphic tablet features support
**GENERAL DRAWING**
Miss it very much:
UNDO
ERASER
COLORPICKER - has to show on palette too which color got picked.
BACKGROUND COLOR -Possibility to select from "New project screen"
Miss it somewhat:
ICON for UNDO
ICON for ERASER
ICON for CLEAR SCREEN ( What can I say? I start over from scratch very often )
BRUSH - possibility to cut out as brush not just copy off image to brush
**ANIMATING**
Miss it very much:
NUMBER OF CELLS - Possibity to change total no. of cells during project
ANIM BRUSH - Possibility to pick up a selected part of cells into an animbrush
Miss it somewhat:
ADD/REMOVE FRAMES: Add/remove single frame
In general LunaPaint is really well done and it feels like a new DeluxePaint version. It works with my tablet. Sure there's much missing of course but things can always be added over time. So there is great potential in LunaPaint that's for sure. Animations could be made in it and maybe put together in QuickVideo, saving in .gif or .mng etc some day.
LAYERS
-Layers names don't get saved globally in animation frames
-Layers order don't change globally in an animation (perhaps as default?).
EXPORTING IMAGES
-Exporting frames to JPG/PNG gives problems with colors. (wrong colors. See my animatiopn --> My robot was blue now it's "gold" ) I think this only happens if you have layers.
-Trying to flatten the layers before export doesn't work if you have animation frames only the one you have visible will flatten properly all other frames are destroyed. (Only one of the layers are visible on them)
-Exporting images filenames should be for example e.g. file0001, file0002...file0010 instead as of now file1, file2...file10
LOAD/SAVE (Preferences)
-Make a setting for the default "Work" folder.
* Destroyed colors if exported image/frame has layers
* mystic color cycling of the selected color while stepping frames back/forth (annoying)
<pre>
Deluxe Paint II enhanced key shortcuts
NOTE: @ denotes the ALT key
[Technique]
F1 - Paint
F2 - Single Colour
F3 - Replace
F4 - Smear
F5 - Shade
F6 - Cycle
F7 - Smooth
M - Colour Cycle
[Brush]
B - Restore
O - Outline
h - Halve brush size
H - Double brush size
x - Flip brush on X axis
X - Double brush size on X axis only
y - Flip on Y
Y - Double on Y
z - Rotate brush 90 degrees
Z - Stretch
[Stencil]
` - Stencil On
[Miscellaneous]
F9 - Info Bar
F10 - Selection Bar
@o - Co-Ordinates
@a - Anti-alias
@r - Colourise
@t - Translucent
TAB - Colour Cycle
[Picture]
L - Load
S - Save
j - Page to Spare(Flip)
J - Page to Spare(Copy)
V - View Page
Q - Quit
[General Keys]
m - Magnify
< - Zoom In
> - Zoom Out
[ - Palette Colour Up
] - Palette Colour Down
( - Palette Colour Left
) - Palette Colour Right
, - Eye Dropper
. - Pixel / Brush Toggle
/ - Symmetry
| - Co-Ordinates
INS - Perspective Control
+/- - Brush Size (Fine Control)
w - Unfilled Polygon
W - Filled Polygon
e - Unfilled Ellipse
E - Filled Ellipse
r - Unfilled Rectangle
R - Filled Rectangle
t - Type/text tool
a - Select Font
u/U - Undo
d - Brush
D - Filled Non-Uniform Polygon
f/F - Fill Options
g/G - Grid
h/H - Brush Size (Coarse Control)
K - Clear
c - Unfilled Circle
C - Filled Circle
v - Line
b - Scissor Select and Toggle
B - Brush
{,} - Toggle between two background colours
</pre>
====Lodepaint====
Pixel based painting artwork app
====Grafx2====
Pixel based painting artwork app aesprite like
[https://www.youtube.com/watch?v=59Y6OTzNrhk aesprite workflow keys and tablet use], [],
====Vector Graphics ZuneFIG====
Vector Image Editing of files .svg .ps .eps
*Objects - raise lower rotate flip aligning snapping
*Path - unify subtract intersect exclude divide
*Colour - fill stroke
*Stroke - size
*Brushes -
*Layers -
*Effects - gaussian bevels glows shadows
*Text -
*Transform -
AmiFIG ([http://epb.lbl.gov/xfig/frm_introduction.html xfig manual])
[[File:MyScreen.png|thumb|left|alt=Showing all Windows open in AmiFIG.|All windows available to AmiFIG.]]
for drawing simple to intermediate vector graphic images for scientific and technical uses and for illustration purposes for those with talent
;Menu options
* Load - fig format but import(s) SVG
* Save - fig format but export(s) eps, ps, pdf, svg and png
* PAN = Ctrl + Arrow keys
* Deselect all points
There is no selected object until you apply the tool, and the selected object is not highlighted.
;Metrics - to set up page and styles - first window to open on new drawings
;Tools - Drawing Primitives - set Attributes window first before clicking any Tools button(s)
* Shapes - circles, ellipses, arcs, splines, boxes, polygon
* Lines - polylines
* Text "T" button
* Photos - bitmaps
* Compound - Glue, Break, Scale
* POINTs - Move, Add, Remove
* Objects - Move, Copy, Delete, Mirror, Rotate, Paste
use right mouse button to stop extra lines, shapes being formed and the left mouse to select/deselect tools button(s)
* Rotate - moves in 90 degree turns centered on clicked POINT of a polygon or square
;Attributes which provide change(s) to the above primitives
* Color
* Line Width
* Line Style
* arrowheads
;Modes
Choose from freehand, charts, figures, magnet, etc.
;Library - allows .fig clip-art to be stored
* compound tools to add .fig(s) together
;FIG 3.2 [http://epb.lbl.gov/xfig/fig-format.html Format] as produced by xfig version 3.2.5
<pre>
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
4 0 0 50 -1 0 12 0.0000 4 135 1050 1050 2475 This is a test.01
</pre>
# change the text alignment within the textbox. I can choose left, center, or right aligned by either changing the integer in the second column from 0 (left) to 1 or 2 (center, or right).
# The third integer in the row specifies fontcolor. For instance, 0 is black, but blue is 1 and Green3 is 13.
# The sixth integer in the bottom row specifies fontface. 0 is Times-Roman, but 16 is Helvetica (a MATLAB default).
# The seventh number is fontsize. 12 represents a 12pt fontsize. Changing the fontsize of an item really is as easy as changing that number to 20.
# The next number is the counter-clockwise angle of the text. Notice that I have changed the angle to .7854 (pi/4 rounded to four digits=45 degrees).
# twelfth number is the position according to the standard “x-axis” in Xfig units from the left. Note that 1200 Xfig units is equivalent to once inch.
# thirteenth number is the “y-position” from the top using the same unit convention as before.
* The nested text string is what you entered into the textbox.
* The “01″ present at the end of that line in the .fig file is the closing tag. For instance, a change to \100 appends a @ symbol at the end of the period of that sentence.
; Just to note there are no layers, no 3d functions, no shading, no transparency, no animation
[[#top|...to the top]]
===Audio===
# AHI uses linear panning/balance, which means that in the center, you will get -6dB. If an app uses panning, this is what you will get. Note that apps like Audio Evolution need panning, so they will have this problem.
# When using AHI Hifi modes, mixing is done in 32-bit and sent as 32-bit data to the driver. The Envy24HT driver uses that to output at 24-bit (always).
# For the Envy24/Envy24HT, I've made 16-bit and 24-bit inputs (called Line-in 16-bit, Line-in 24-bit etc.). There is unfortunately no app that can handle 24-bit recording.
====Music Mods====
Digital module (mods) trackers are music creation software using samples and sometimes soundfonts, audio plugins (VST, AU or RTAS), MIDI.
Generally, MODs are similar to MIDI in that they contain note on/off and other sequence messages that control the mod player. Unlike (most) midi files, however, they also contain sound samples that the sequence information actually plays. MOD files can have many channels (classic amiga mods have 4, corresponding to the inbuilt sound channels), but unlike MIDI, each channel can typically play only one note at once. However, since that note might be a sample of a chord, a drumloop or other complex sound, this is not as limiting as it sounds.
Like MIDI, notes will play indefinitely if they're not instructed to end. Most trackers record this information automatically if you play your music in live. If you're using manual note entry, you can enter a note-off command with a keyboard shortcut - usually Caps Lock.
In fact when considering file size MOD is not always the best option. Even a dummy song wastes few kilobytes for nothing when a simple SID tune could be few hundreds bytes and not bigger than 64kB. AHX is another small format, AHX tunes are never larger than 64kB excluding comments.
[https://www.youtube.com/watch?v=rXXsZfwgil Protrekkr] (previously aka [w:Juan_Antonio_Arguelles_Rius|NoiseTrekkr])
If Protrekkr does not start, please check if the Unit 0 has been setup in the AHI prefs and still not, go to the directory utilities/protrekkr and double click on the Protrekkr icon
*Sample
*Note - Effect
*Track (column) - Pattern - Order
It all starts with the Sample which is used to create Note(s) in a Track (column of a tracker)
The Note can be changed with an Effect. A Track of Note(s) can be collected into a Pattern (section of a song) and these can be given Order to create the whole song.
Patience (notes have to be entered one at a time) or playing the bassline on a midi controller (faster - see midi section above). Best approach is to wait until a melody popped into your head.
*Up-tempo means the track should be reasonably fast, but not super-fast.
*Groovy and funky imply the track should have some sort of "swing" feel, with plenty of syncopation or off beat emphasis and a recognizable, melodic bass line.
*Sweet and happy mean upbeat melodies, a major key and avoiding harsh sounds.
*Moody - minor key
First, create a quick bass sound, which is basically a sine wave, but can be hand drawn for a little more variance. It could also work for the melody part, too.
This is usually a bass guitar or some kind of synthesizer bass. The bass line is often forgotten by inexperienced composers, but it plays an important role in a musical piece. Together with the rhythm section the bass line forms the groove of a song. It's the glue between the rhythm section and the melodic layer of a song.
The drums are just pink noise samples, played at different frequencies to get a slightly different sound for the kick, snare, and hihats.
Instruments that fall into the rhythm category are bass drums, snares, hi-hats, toms, cymbals, congas, tambourines, shakers, etc. Any percussive instrument can be used to form part of the rhythm section.
The lead is the instrument that plays the main melody, on top of the chords. There are many instruments that can play a lead section, like a guitar, a piano, a saxophone or a flute. The list is almost endless. There is a lot of overlap with instruments that play chords. Often in one piece an instrument serves both roles. The lead melody is often played at a higher pitch than the chords.
Listened back to what was produced so far, and a counter-melody can be imagined, which can be added with a triangle wave.
To give the ends of phrases some life, you can add a solo part with a crunchy synth. By hitting random notes in the key of G, then edited a few of them.
For the climax of the song, filled out the texture with a gentle high-pitch pad… …and a grungy bass synth.
The arrow at A points at the pattern order list. As you see, the patterns don't have to be in numerical order. This song starts with pattern "00", then pattern "02", then "03", then "01", etcetera. Patterns may be repeated throughout a song.
The B arrow points at the song title. Below it are the global BPM and speed parameters. These determine the tempo of the song, unless the tempo is altered through effect commands during the song.
The C arrow points at the list of instruments. An instrument may consist of multiple samples. Which sample will be played depends on the note. This can be set in the Instrument Editing screen. Most instruments will consist of just one sample, though. The sample list for the selected instrument can be found under arrow D.
Here's a part of the main editing screen. This is where you put in actual notes. Up to 32 channels can be used, meaning 32 sounds can play simultaneously. The first six channels of pattern "03" at order "02" are shown here. The arrow at A points at the row number. The B arrow points at the note to play, in this case a C4. The column pointed at by the C arrow tells us which instrument is associated with that note, in this case instrument #1 "Kick".
The column at D is used (mainly) for volume commands. In this case it is left empty which means the instrument should play at its default volume. You can see the volume column being used in channel #6.
The E column tells us which effect to use and any parameters for that effect. In this case it holds the "F" effect, which is a tempo command. The "04" means it should play at tempo 4 (a smaller number means faster).
Base pattern
When I create a new track I start with what I call the base pattern. It is worthwhile to spend some time polishing it as a lot of the ideas in the base pattern will be copied and used in other patterns. At least, that's how I work. Every musician will have his own way of working. In "Wild Bunnies" the base pattern is pattern "03" at order "02".
In the section about selecting samples I talked about the four different categories of instruments: drums, bass, chords and leads. That's also how I usually go about making the base pattern. I start by making a drum pattern, then add a bass line, place some chords and top it off with a lead. This forms the base pattern from which the rest of the song will grow.
Drums
Here's a screenshot of the first four rows of the base pattern. I usually reserve the first four channels or so for the drum instruments. Right away there are a couple of tricks shown here. In the first channel the kick, or bass drum, plays some notes. Note the alternating F04 and F02 commands. The "F" command alters the tempo of the song and by quickly alternating the tempo; the song will get some kind of "swing" feel.
In the second channel the closed hi-hat plays a fairly simple pattern. Further down in the channel, not shown here, some open hi-hat notes are added for a bit of variation.
In the third and fourth channel the snare sample plays. The "8" command is for panning. One note is panned hard to the left and the other hard to the right. One sample is played a semitone lower than the other. This results in a cool flanging effect. It makes the snare stand out a little more in the mix.
Bass line
There are two different instruments used for the bass line. Instrument #6 is a pretty standard synthesized bass sound. Instrument #A sounds a bit like a slap bass when used with a quick fade out. By using two different instruments the bass line sounds a bit more ”human”. The volume command is used to cut off the notes. However, it is never set to zero. Setting the volume to a very small value will result in a reverb-like effect. This makes the song sound more "live".
The bass line hints at the chords that will be played and the key the song will be in. In this case the key of the song is D-major, a positive and happy key.
Chords
The D major chords that are being played here are chords stabs; short sounds with a quick decay (fade out). Two different instruments (#8 and #9) are used to form the chords. These instruments are quite similar, but have a slightly different sound, panning and volume decay. Again, the reason for this is to make the sound more human. The volume command is used on some chords to simulate a delay, to achieve more of a live feel. The chords are placed off-beat making for a funky rhythm.
Lead
Finally the lead melody is added. The other instruments are invaluable in holding the track together, but the lead melody is usually what catches people's attention.
A lot of notes and commands are used here, but it looks more complex than it is. A stepwise ascending melody plays in channel 13. Channel 14 and 15 copy this melody, but play it a few rows later at a lower volume. This creates an echo effect. A bit of panning is used on the notes to create some stereo depth. Like with the bass line, instead of cutting off notes the volume is set to low values for a reverb effect. The "461" effect adds a little vibrato to the note, which sounds nice on sustained notes.
Those paying close attention may notice the instrument used here for the lead melody is the same as the one used for the bass line (#6 "Square"), except played two or three octaves higher. This instrument is a looped square wave sample. Each type of wave has its own quirks, but the square wave (shown below) is a really versatile wave form.
Song structure
Good, catchy songs are often carefully structured into sections, some of which are repeated throughout the song with small variations.
A typical pop-song structure is: Intro - Verse - Chorus - Verse - Chorus - Bridge - Chorus.
Other single sectional song structures are
<pre>
Strophic or AAA Song Form - oldest story telling with refrain (often title of the song) repeated in every verse section melody
AABA Song Form - early popular, jazz and gospel fading during the 1960s
AB or Verse/Chorus Song Form - songwriting format of choice for modern popular music since the 1960s
Verse/Chorus/Bridge Song Form
ABAB Song Form
ABAC Song Form
ABCD Song Form
AAB 12-Bar Song Form - three four-bar lines or sub-sections
8-Bar Song Form
16-Bar Song Form
Hybrid / Compound Song Forms
</pre>
The most common building blocks are:
#INTRODUCTION(INTRO)
#VERSE
#REFRAIN
#PRE-CHORUS / RISE / CLIMB
#CHORUS
#BRIDGE
#MIDDLE EIGHT
#SOLO / INSTRUMENTAL BREAK
#COLLISION
#CODA / OUTRO
#AD LIB (OFTEN IN CODA / OUTRO)
The chorus usually has more energy than the verse and often has a memorable melody line. As the chorus is repeated the most often during the song, it will be the part that people will remember.
The bridge often marks a change of direction in the song. It is not uncommon to change keys in the bridge, or at least to use a different chord sequence. The bridge is used to build up tension towards the big finale, the last repetition of chorus.
Playing
RCTRL: Play song from row 0.
LSHIFT + RCTRL: Play song from current row.
RALT: Play pattern from row 0.
LSHIFT + RALT: Play pattern from current row.
Left mouse on '>': Play song from row 0.
Right mouse on '>': Play song from current row.
Left mouse on '|>': Play pattern from row 0.
Right mouse on '|>': Play pattern from current row.
Left mouse on 'Edit/Record': Edit mode on/off.
Right mouse on 'Edit/Record': Record mode on/off.
Editing
LSHIFT + ESCAPE: Switch large patterns view on/off
TAB: Go to next track
LSHIFT + TAB: Go to prev. track
LCTRL + TAB: Go to next note in track
LCTRL + LSHIFT + TAB: Go to prev. note in track
SPACE: Toggle Edit mode On & Off
(Also stop if the song is being played)
SHIFT SPACE: Toggle Record mode On & Off
(Wait for a key note to be pressed
or a midi in message to be received)
DOWN ARROW: 1 Line down
UP ARROW: 1 Line up
LEFT ARROW: 1 Row left
RIGHT ARROW: 1 Row right
PREV. PAGE: 16 Arrows Up
NEXT PAGE: 16 Arrows Down
HOME / END: Top left / Bottom right of pattern
LCTRL + HOME / END: First / last track
F5, F6, F7, F8, F9: Jump to 0, 1/4, 2/4, 3/4, 4/4 lines of the patterns
+ - (Numeric keypad): Next / Previous pattern
LCTRL + LEFT / RIGHT: Next / Previous pattern
LCTRL + LALT + LEFT / RIGHT: Next / Previous position
LALT + LEFT / RIGHT: Next / Previous instrument
LSHIFT + M: Toggle mute state of the current channel
LCTRL + LSHIFT + M: Solo the current track / Unmute all
LSHIFT + F1 to F11: Select a tab/panel
LCTRL + 1 to 4: Select a copy buffer
Tracking
1st and 2nd keys rows: Upper octave row
3rd and 4th keys rows: Lower octave row
RSHIFT: Insert a note off
/ and * (Numeric keypad)
or F1 F2: -1 or +1 octave
INSERT / BACKSPACE: Insert or Delete a line in current track
or current selected block.
LSHIFT + INSERT / BACKSPACE: Insert or Delete a line in current pattern
DELETE (NOT BACKSPACE): Empty a column or a selected block.
Blocks
(Blocks can also be selected with the mouse by holding the right button and scrolling the pattern with the mouse wheel).
LCTRL + A: Select entire current track
LCTRL + LSHIFT + A: Select entire current pattern
LALT + A: Select entire column note in a track
LALT + LSHIFT + A: Select all notes of a track
LCTRL + X: Cut the selected block and copy it into the block-buffer
LCTRL + C: Copy the selected block into the block-buffer
LCTRL + V: Paste the data from the block buffer into the pattern
LCTRL + I: Interpolate selected data from the first to the last row of a selection
LSHIFT + ARROWS
PREV. PAGE
NEXT PAGE: Select a block
LCTRL + R: Randomize the select columns of a selection, works similar to CTRL + I (interpolating them)
LCTRL + U: Transpose the note of a selection to 1 seminote higher
LCTRL + D: Transpose the note of a selection to 1 seminote lower
LCTRL + LSHIFT + U: Transpose the note of a selection to 1 seminote higher (only for the current instrument)
LCTRL + LSHIFT + D: Transpose the note of a selection to 1 seminote lower (only for the current instrument)
LCTRL + H: Transpose the note of a selection to 1 octave higher
LCTRL + L: Transpose the note of a selection to 1 octave lower
LCTRL + LSHIFT + H: Transpose the note of a selection to 1 octave higher (only for the current instrument)
LCTRL + LSHIFT + L: Transpose the note of a selection to 1 octave lower (only for the current instrument)
LCTRL + W: Save the current selection into a file
Misc
LALT + ENTER: Switch between full screen / windowed mode
LALT + F4: Exit program (Windows only)
LCTRL + S: Save current module
LSHIFT + S: Switch top right panel to synths list
LSHIFT + I: Switch top right panel to instruments list
<pre>
C-x xh xx xx hhhh Volume
B-x xh xx xx hhhh Jump to
A#x xh xx xx hhhh hhhh Slide
F-x xh xx xx hhhh Tempo
D-x xh xx xx hhhh Pattern Break
G#x xh xx xx hhhh
</pre>
h Hex 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
d Dec 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
The Set Volume command: C. Input a note, then move the cursor to the effects command column and type a C. Play the pattern, and you shouldn't be able to hear the note you placed the C by. This is because the effect parameters are 00. Change the two zeros to a 40(Hex)/64(Dec), depending on what your tracker uses. Play back the pattern again, and the note should come in at full volume.
The Position Jump command next. This is just a B followed by the position in the playing list that you want to jump to. One thing to remember is that the playing list always starts at 0, not 1. This command is usually in Hex.
Onto the volume slide command: A. This is slightly more complex (much more if you're using a newer tracker, if you want to achieve the results here, then set slides to Amiga, not linear), due to the fact it depends on the secondary tempo. For now set a secondary tempo of 06 (you can play around later), load a long or looped sample and input a note or two. A few rows after a note type in the effect command A. For the parameters use 0F. Play back the pattern, and you should notice that when the effect kicks in, the sample drops to a very low volume very quickly. Change the effect parameters to F0, and use a low volume command on the note. Play back the pattern, and when the slide kicks in the volume of the note should increase very quickly.
This because each part of the effect parameters for command A does a different thing. The first number slides the volume up, and the second slides it down. It's not recommended that you use both a volume up and volume down at the same time, due to the fact the tracker only looks for the first number that isn't set to 0. If you specify parameters of 8F, the tracker will see the 8, ignore the F, and slide the volume up. Using a slide up and down at same time just makes you look stupid. Don't do it...
The Set Tempo command: F, is pretty easy to understand. You simply specify the BPM (in Hex) that you want to change to. One important thing to note is that values of lower than 20 (Hex) sets the secondary tempo rather than the primary.
Another useful command is the Pattern Break: D. This will stop the playing of the current pattern and skip to the next one in the playing list. By using parameters of more than 00 you can also specify which line to begin playing from.
Command 3 is Portamento to Note. This slides the currently playing note to another note, at a specified speed. The slide then stops when it reaches the desired note.
<pre>
C-2 1 000 - Starts the note playing
--- 000
C-3 330 - Starts the slide to C-3 at a speed of 30.
--- 300 - Continues the slide
--- 300 - Continues the slide
</pre>
Once the parameters have been set, the command can be input again without any parameters, and it'll still perform the same function unless you change the parameters. This memory function allows certain commands to function correctly, such as command 5, which is the Portamento to Note and Volume Slide command. Once command 3 has been set up command 5 will simply take the parameters from that and perform a Portamento to Note. Any parameters set up for command 5 itself simply perform a Volume Slide identical to command A at the same time as the Portamento to Note.
This memory function will only operate in the same channel where the original parameters were set up.
There are various other commands which perform two functions at once. They will be described as we come across them.
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 00
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 02
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 05
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 08
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 0A
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 0D
C-3 04 .. .. 09 10 ---> C-3 04 .. .. 09 10
(You can also switch on the Slider Rec to On, and perform parameter-live-recording, such as cutoff transitions, resonance or panning tweaking, etc..) Note: this command only works for volume/panning and fx datas columns.
The next command we'll look at is the Portamento up/down: 1 and 2. Command 1 slides the pitch up at a specified speed, and 2 slides it down. This command works in a similar way to the volume slide, in that it is dependent on the secondary tempo. Both these commands have a memory dependent on each other, if you set the slide to a speed of 3 with the 1 command, a 2 command with no parameters will use the speed of 3 from the 1 command, and vice versa.
Command 4 is Vibrato. Vibrato is basically rapid changes in pitch, just try it, and you'll see what I mean. Parameters are in the format of xy, where x is the speed of the slide, and y is the depth of the slide. One important point to remember is to keep your vibratos subtle and natural so a depth of 3 or less and a reasonably fast speed, around 8, is usually used. Setting the depth too high can make the part sound out of tune from the rest.
Following on from command 4 is command 6. This is the Vibrato and Volume Slide command, and it has a memory like command 5, which you already know how to use.
Command 7 is Tremolo. This is similar to vibrato. Rather than changing the pitch it slides the volume. The effect parameters are in exactly the same format. vibrato effect (0x1dxy) x = speed y = depth (can't be used if arpeggio (0x1b) is turned on)
<pre>
C-7 00 .. .. 1B37 <- Turn Arpeggio effect on
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 1B38 <- Change datas
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 1B00 <- Turn it off
</pre>
Command 9 is Sample Offset. This starts the playback of the sample from a different place than the start. The effect parameters specify the sample offset, but only very roughly. Say you have a sample which is 8765(Hex) bytes long, and you wanted it to play from position 4321(Hex). The effect parameter could only be as accurate as the 43 part, and it would ignore the 21.
Command B is the Playing List/Order Jump command. The parameters specify the position in the Playing List/Order to jump to. When used in conjunction with command D you can specify the position and the line to play from.
Command E is pretty complex, as it is used for a lot of different things, depending on what the first parameter is. Let's take a trip through each effect in order.
Command E0 controls the hardware filter on an Amiga, which, as a low pass filter, cuts off the highest frequencies being played back. There are very few players and trackers on other system that simulate this function, not that you should need to use it. The second parameter, if set to 1, turns on the filter. If set to 0, the filter gets turned off.
Commands E1/E2 are Fine Portamento Up/Down. Exactly the same functions as commands 1/2, except that they only slide the pitch by a very small amount. These commands have a memory the same as 1/2 as well.
Command E3 sets the Glissando control. If parameters are set to 1 then when using command 3, any sliding will only use the notes in between the original note and the note being slid to. This produces a somewhat jumpier slide than usual. The best way to understand is to try it out for yourself. Produce a slow slide with command 3, listen to it, and then try using E31.
Command E4 is the Set Vibrato Waveform control. This command controls how the vibrato command slides the pitch. Parameters are 0 - Sine, 1 - Ramp Down (Saw), 2 - Square. By adding 4 to the parameters, the waveform will not be restarted when a new note is played e.g. 5 - Sine without restart.
Command E5 sets the Fine Tune of the instrument being played, but only for the particular note being played. It will override the default Fine Tune for the instrument. The parameters range from 0 to F, with 0 being -8 and F being +8 Fine Tune. A parameter of 8 gives no Fine Tune. If you're using a newer tracker that supports more than -8 to +8 e.g. -128 to +128, these parameters will give a rough Fine Tune, accurate to the nearest 16.
Command E6 is the Jump Loop command. You mark the beginning of the part of a pattern that you want to loop with E60, and then specify with E6x the end of the loop, where x is the number of times you want it to loop.
Command E7 is the Set Tremolo Waveform control. This has exactly the same parameters as command E4, except that it works for Tremolo rather than Vibrato.
Command E9 is for Retriggering the note quickly. The parameter specifies the interval between the retrigs. Use a value of less than the current secondary tempo, or else the note will not get retrigged.
Command EA/B are for Fine Volume Slide Up/Down. Much the same as the normal Volume Slides, except that these are easier to control since they don't depend on the secondary tempo. The parameters specify the amount to slide by e.g. if you have a sample playing at a volume of 08 (Hex) then the effect EA1 will slide this volume to 09 (Hex). A subsequent effect of EB4 would slide this volume down to 05 (Hex).
Command EC is the Note Cut. This sets the volume of the currently playing note to 0 at a specified tick. The parameters should be lower than the secondary tempo or else the effect won't work.
Command ED is the Note Delay. This should be used at the same time as a note is to be played, and the parameters will specify the number of ticks to delay playing the note. Again, keep the parameters lower than the secondary tempo, or the note won't get played!
Command EE is the Pattern Delay. This delays the pattern for the amount of time it would take to play a certain number of rows. The parameters specify how many rows to delay for.
Command EF is the Funk Repeat command. Set the sample loop to 0-1000. When EFx is used, the loop will be moved to 1000- 2000, then to 2000-3000 etc. After 9000-10000 the loop is set back to 0- 1000. The speed of the loop "movement" is defined by x. E is two times as slow as F, D is three times as slow as F etc. EF0 will turn the Funk Repeat off and reset the loop (to 0-1000).
effects 0x41 and 0x42 to control the volumes of the 2 303 units
There is a dedicated panel for synth parameter editing with coherent sections (osc, filter modulation, routing, so on) the interface is much nicer, much better to navigate with customizable colors, the reverb is now customizable (10 delay lines), It accepts newer types of Waves (higher bit rates, at least 24). Has a replay routine.
It's pretty much your basic VA synth. The problem isn't with the sampler being to high it's the synth is tuned two octaves too low, but if you want your samples tuned down just set the base note down 2 octaves (in the instrument panel).
so the synth is basically divided into 3 sections from left to right: oscillators/envelopes, then filter and LFO's, and in the right column you have mod routings and global settings.
for the oscillator section you have two normal oscillators (sine, saw, square, noise), the second of which is tunable, the first one tunes with the key pressed. Attached to OSC 1 is a sub-oscillator, which is a sawtooth wave tuned one octave down. The phase modulation controls the point in the duty cycle at which the oscillator starts. The ADSR envelope sliders (grouped with oscs) are for modulation envelope 1 and 2 respectively. you can use the synth as a sampler by choosing the instrument at the top.
In the filter column, the filter settings are: 1 = lowpass, 2 = highpass, 3 = off. cutoff and resonance. For the LFOs they are LFO 1 and LFO 2, the ADSR sliders in those are for the LFO itself.
For the modulation routings you have ENV 1, LFO 1 for the first slider and ENV 2, LFO 2 for the second, you can cycle through the individual routings there, and you can route each modulation source to multiple destinations of course, which is another big plus for this synth. Finally the glide time is for portamento and master volume, well, the master volume... it can go quite loud.
The sequencer is changed too, It's more like the one in AXS if you've used that, where you can mute tracks to re-use patterns with variation.
<pre>
Support for the following modules formats:
669 (Composer 669, Unis 669),
AMF (DSMI Advanced Module Format),
AMF (ASYLUM Music Format V1.0),
APUN (APlayer), DSM (DSIK internal format),
FAR (Farandole Composer),
GDM (General DigiMusic),
IT (Impulse Tracker),
IMF (Imago Orpheus),
MOD (15 and 31 instruments),
MED (OctaMED),
MTM (MultiTracker Module editor),
OKT (Amiga Oktalyzer),
S3M (Scream Tracker 3),
STM (Scream Tracker),
STX (Scream Tracker Music Interface Kit),
ULT (UltraTracker),
UNI (MikMod),
XM (FastTracker 2),
Mid (midi format via timidity)
</pre>
Possible plugin options include [http://lv2plug.in/ LV2],
====Midi - Musical Instrument Digital Interface====
A midi file typically contains music that plays on up to 16 channels (as per the midi standard), but many notes can simultaneously play on each channel (depending on the limit of the midi hardware playing it).
'''Timidity'''
Although usually already installed, you can uncompress the [http://www.libsdl.org/projects/SDL_mixer/ timidity.tar.gz (14MB)] into a suitable drawer like below's SYS:Extras/Audio/
assign timidity: SYS:Extras/Audio/timidity
added to SYSːs/User-Startup
'''WildMidi playback'''
'''Audio Evolution 4 (2003) 4.0.23 (from 2012)'''
*Sync Menu - CAMD Receive, Send checked
*Options Menu - MIDI Machine Control - Midi Bar Display - Select CAMD MIDI in / out - Midi Remote Setup
MCB Master Control Bus
*Sending a MIDI start-command and a Song Position Pointer, you can synchronize audio with an external MIDI sequencer (like B&P).
*B&P Receive, start AE, add AudioEvolution.ptool in Bars&Pipes track, press play / record in AE then press play in Pipes
*CAMD Receive, receive MIDI start or continue commands via camd.library sync to AE
*MIDI Machine Control
*Midi Bar Display
*Select CAMD MIDI in / out
*Midi Remote Setup - open requester for external MIDI controllers to control app mixer and transport controls cc remotely
Channel - mixer(vol, pan, mute, solo), eq, aux, fx,
Subgroup - Volume, Mute, Solo
Transport - Start, End, Play, Stop, Record, Rewind, Forward
Misc - Master vol., Bank Down, Bank up
<pre>
q - quit
First 3 already opened when AE started
F1 - timeline window
F2 - mixer
F3 - control
F4 - subgroups
F5 - aux returns
F6 - sample list
i - Load sample to use
space - start/stop play
b - reset time 0:00
s - split mode
r - open recording window
a - automation edit mode with p panning, m mute and v volume
[ / ] - zoom in / out
: - previous track
* - next track
x c v f - cut copy paste cross-fade
g - snap grid
</pre>
'''[http://bnp.hansfaust.de/ Bars n Pipes sequencer]'''
BarsnPipes debug ... in shell
Menu (right mouse)
*Song - Songs load and save in .song format but option here to load/save Midi_Files .mid in FORMAT0 or FORMAT1
*Track -
*Edit -
*Tool -
*Timing - SMTPE Synchronizing
*Windows -
*Preferences - Multiple MIDI-in option
Windows (some of these are usually already opened when Bars n Pipes starts up for the first time)
*Workflow -> Tracks, .... Song Construction, Time-line Scoring, Media Madness, Mix Maestro,
*Control -> Transport (or mini one), Windows (which collects all the Windows icons together-shortcut), .... Toolbox, Accessories, Metronome,
Once you have your windows placed on the screen that suits your workflow, Song -> Save as Default will save the positions, colors, icons, etc as you'd like them
If you need a particular setup of Tracks, Tools, Tempos etc, you save them all as a new song you can load each time
Right mouse menu -> Preferences -> Environment... -> ScreenMode - Linkages for Synch (to Slave) usbmidi.out.0 and Send (Master) usbmidi.in.0 - Clock MTC
'''Tracks'''
#Double-click on B&P's icon. B&P will then open with an empty Song. You can also double-click on a song icon to open a song in B&P.
#Choose a track. The B&P screen will contain a Tracks Window with a number of tracks shown as pipelines (Track 1, Track 2, etc...). To choose a track, simply click on the gray box to show an arrow-icon to highlight it. This icon show whether a track is chosen or not. To the right of the arrow-icon, you can see the icon for the midi-input. If you double-click on this icon you can change the MIDI-in setup.
#Choose Record for the track. To the right of the MIDI-input channel icon you can see a pipe. This leads to another clickable icon with that shows either P, R or M. This stands for Play, Record or Merge. To change the icon, simply click on it. If you choose P, this track can only play the track (you can't record anything). If you choose R, you can record what you play and it overwrites old stuff in the track. If you choose M, you merge new records with old stuff in the track. Choose R now to be able to make a record.
#Chose MIDI-channel. On the most right part of the track you can see an icon with a number in it. This is the MIDI-channel selector. Here you must choose a MIDI-channel that is available on your synthesizer/keyboard. If you choose General MIDI channel 10, most synthesizer will play drum sounds. To the left of this icon is the MIDI-output icon. Double-click on this icon to change the MIDI-output configuration.
#Start recording. The next step is to start recording. You must then find the control buttons (they look like buttons on a CD-player). To be able to make a record. you must click on the R icon. You can simply now press the play button (after you have pressed the R button) and play something on you keyboard. To playback your composition, press the Play button on the control panel.
#Edit track. To edit a track, you simply double click in the middle part of a track. You will then get a new window containing the track, where you can change what you have recorded using tools provided. Take also a look in the drop-down menus for more features.
Videos to help understand [https://www.youtube.com/watch?v=A6gVTX-9900 small intro], [https://www.youtube.com/watch?v=abq_rUTiSA4&t=3s Overview], [https://www.youtube.com/watch?v=ixOVutKsYQo Workplace Setup CC PC Sysex], [https://www.youtube.com/watch?v=dDnJLYPaZTs Import Song], [https://www.youtube.com/watch?v=BC3kkzPLkv4 Tempo Mapping], [https://www.youtube.com/watch?v=sd23kqMYPDs ptool Arpeggi-8], [https://www.youtube.com/watch?v=LDJq-YxgwQg PlayMidi Song], [https://www.youtube.com/watch?v=DY9Pu5P9TaU Amiga Midi], [https://www.youtube.com/watch?v=abq_rUTiSA4 Learning Amiga bars and Pipes],
Groups like [https://groups.io/g/barsnpipes/topics this] could help
'''Tracks window'''
* blue "1 2 3 4 5 6 7 8 Group" and transport tape deck VCR-type controls
* Flags
* [http://theproblem.alco-rhythm.com/org/bp.html Track 1, Track2, to Track 16, on each Track there are many options that can be activated]
Each Track has a
*Left LHS - Click in grey box to select what Track to work on, Midi-In ptool icon should be here (5pin plug icon), and many more from the Toolbox on the Input Pipeline
*Middle - (P, R, M) Play, Record, Merge/Multi before the sequencer line and a blue/red/yellow (Thru Mute Play) Tap
*Right RHS - Output pipeline, can have icons placed uopn it with the final ptool icon(s) being the 5pin icon symbol for Midi-OUT
Clogged pipelines may need Esc pressed several times
'''Toolbox (tools affect the chosen pipeline)'''
After opening the Toolbox window you can add extra Tools (.ptool) for the pipelines like keyboard(virtual), midimonitor, quick patch, transpose, triad, (un)quantize, feedback in/out, velocity etc
right mouse -> Toolbox menu option -> Install Tool... and navigate to Tool drawer (folder) and select requried .ptool
Accompany B tool to get some sort of rythmic accompaniment, Rythm Section and Groove Quantize are examples of other tools that make use of rythms
[https://aminet.net/search?query=bars Bars & Pipes pattern format .ptrn] for drawer (folder). Load from the Menu as Track or Group
'''Accessories (affect the whole app)'''
Accessories -> Install... and goto the Accessories drawer for .paccess like adding ARexx scripting support
'''Song Construction'''
<pre>
F1 Pencil
F2 Magic Wand
F3 Hand
F4 Duplicator
F5 Eraser
F6 Toolpad
F7 Bounding box
F8 Lock to A-B-A
A-B-A strip, section, edit flags, white boxes,
</pre>
Bars&Pipes Professional offers three track formats; basic song tracks, linear tracks — which don't loop — and finally real‑time tracks. The difference between them is that both song and linear tracks respond to tempo changes, while real‑time tracks use absolute timing, always trigger at the same instant regardless of tempo alterations
'''Tempo Map'''
F1 Pencil
F2 Magic Wand
F3 Hand
F4 Eraser
F5 Curve
F6 Toolpad
Compositions
Lyrics, Key, Rhythm, Time Signature
'''Master Parameters'''
Key, Scale/Mode
'''Track Parameters'''
Dynamics
'''Time-line Scoring'''
'''Media Madness'''
'''Mix Maestro'''
*ACCESSORIES Allows the importation of other packages and additional modules
*CLIPBOARD Full cut, copy and paste operations, enabling user‑definable clips to be shared between tracks.
*INFORMATION A complete rundown on the state of the current production and your machine.
*MASTER PARAMETERS Enables global definition of time signatures, lyrics, scales, chords, dynamics and rhythm changes.
*MEDIA MADNESS A complete multimedia sequencer which allows samples, stills, animation, etc
*METRONOME Tempo feedback via MIDI, internal Amiga audio and colour cycling — all three can be mixed and matched as required.
*MIX MAESTRO Completely automated mixdown with control for both volume and pan. All fader alterations are memorised by the software
*RECORD ACTIVATION Complete specification of the data to be recorded/merged. Allows overdubbing of pitch‑bend, program changes, modulation etc
*SET FLAGS Numeric positioning of location and edit flags in either SMPTE or musical time
*SONG CONSTRUCTION Large‑scale cut and paste of individual measures, verses or chorus, by means of bounding box and drag‑n‑drop mouse selections
*TEMPO MAP Tempo change using a variety of linear and non‑linear transition curves
*TEMPO PALETTE Instant tempo changes courtesy of four user‑definable settings.
*TIMELINE SCORING Sequencing of a selection of songs over a defined period — ideal for planning an entire set for a live performance.
*TOOLBOX Selection screen for the hundreds of signal‑processing tools available
*TRACKS Opens the main track window to enable recording, editing and the use of tools.
*TRANSPORT Main playback control window, which also provides access to user‑ defined flags, loop and punch‑in record modes.
Bars and Pipes Pro 2.5 is using internal 4-Byte IDs, to check which kind of data are currently processed.
Especially in all its files the IDs play an important role. The IDs are stored into the file in the same order they are laid out in the memory.
In a Bars 'N' Pipes file (no matter which kind) the ID "NAME" (saved as its ANSI-values) is stored on a big endian system (68k-computer) as "NAME". On a little endian system (x86 PC computer) as "EMAN". The target is to make the AROS-BnP compatible to songs, which were stored on a 68k computer (AMIGA).
If possible, setting MIDI channels for Local Control for your keyboard
http://www.fromwithin.com/liquidmidi/archive.shtml
MIDI files are essentially a stream of event data. An event can be many things, but typically "note on", "note off", "program change", "controller change", or messages that instruct a MIDI compatible synth how to play a given bit of music.
* Channel - 1 to 16 -
* Messages - PC presets, CC effects like delays, reverbs, etc
* Sequencing - MIDI instruments, Drums, Sound design,
* Recording -
* GUI - Piano roll or Tracker, Staves and Notes
MIDI events/messages like step entry e.g. Note On, Note Off
MIDI events/messages like PB, PC, CC, Mono and Poly After-Touch, Sysex, etc
MIDI sync - Midi Clocks (SPS Measures), Midi Time Code (h, m, s and frames) SMPTE
Individual track editing with audition edits so easier to test any changes. Possible to stop track playback, mix clips from the right edit flag and scroll the display using arrow keys.
Step entry, to extend a selected note hit the space bar and the note grows accordingly. Ability to cancel mouse‑driven edits by simply clicking the right mouse button — at which point everything snaps back into its original form. Lyrics can now be put in with syllable dividers, even across an entire measure or section. Autoranging when you open a edit window, the notes are automatically displayed — working from the lowest upwards.
Flag editing, shift‑click on a flag immediately open the bounds window, ready for numeric input. Ability to cancel edits using the right‑hand mouse button, plus much improved Bounding Box operations.
Icons other than the BarsnPipes icon -> PUBSCREEN=BarsnPipes (cannot choose modes higher than 8bit 256 colors)
Preferences -> Menu in Tracks window - Send MIDI defaults OFF
Prefs -> Environment -> screenmode (saved to BarsnPipes.prefs binary file)
Customization -> pics in gui drawer (folder) -
Can save as .song files and .mid General Midi
SMF is a “Standard Midi File” ([http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html SMF0, SMF1 and SMF2]), [https://github.com/stump/libsmf libsmf], [https://github.com/markc/midicomp MIDIcomp], [https://github.com/MajicDesigns/MD_MIDIFile C++ src], [], [https://github.com/newdigate/midi-smf-reader Midi player],
* SMF0 All MIDI data is stored in one track only, separated exclusively by the MIDI channel.
* SMF1 The MIDI data is stored in separate tracks/channels.
* SMF2 (rarely used) The MIDI data is stored in separate tracks, which are additionally wrapped in containers, so it's possible to have e.g. several tracks using the same MIDI channels.
Would it be possible to enrich Bars N’Pipes with software synth and sample support along with audio recording and mastering tools like in the named MAC or PC music sequencers?
On the classic AMIGA-OS this is not possible because of missing CPU-power. The hardware of the classic AMIGA is not further developed. So we must say (unfortunately) that those dreams can’t become reality
BarsnPipes is best used with external MIDI-equipment. This can be a keyboard or synthesizer with MIDI-connectors.
<pre>
MIDI can control 16 channels
There are USB-MIDI-Interfaces on the market with 16 independent MIDI-lines (multi-port), which can handle 16 MIDI devices independently – 16×16 = 256 independent MIDI-channels or instruments
handle up to 16 different USB-MIDI-Interfaces (multi-device). That is: 16X16X16 = 4096 independent MIDI-channels – theoretically
</pre>
<pre>
Librarian MIDI SYStem EXplorer (sysex) - PatchEditor and used to be supplied as a separate program like PatchMeister but currently not at present
It should support MIDI.library (PD), BlueRibbon.library (B&P), TriplePlayPlus, and CAMD.library (DeluxeMusic) and
MIDI information from a device's user manual and configure a custom interface to access parameters for all MIDI products connected to the system
Supports ALL MIDI events and the Patch/Librarian data is stored in MIDI standard format
Annette M.Crowling, Missing Link Software, Inc.
</pre>
Composers
<pre>
[https://x.com/hirasawa/status/1403686519899054086 Susumu Hirasawa]
</pre>
<pre>
1988 Todor Fay and his wife Melissa Jordan Gray, who founded the Blue Ribbon Inc
1992 Bars&Pipes Pro published
November 2000, Todor Fay announcement to release the sourcecode of Bars&Pipes Pro 2.5c beta
end of May 2001, the source of the main program and the sources of some tools and accessories were in a complete and compileable state
end of October 2009 stop further development of BarsnPipes New for now on all supported systems and made freeware
2013 Alfred Faust diagnosed with incureable illness, called „Myastenia gravis“ (weak muscles)
</pre>
Protrekkr
How to use Midi In/Out in Protrekkr ?
First of all, midi in & out capabilities of this program are rather limited.
# Go to Misc. Setup section and select a midi in or out device to use (ptk only supports one device at a time).
# Go to instrument section, and select a MIDI PRG (the default is N/A, which means no midi program selected).
# Go to track section and here you can assign a midi channel to each track of ptk.
# Play notes :]. Note off works. F'x' note cut command also works too, and note-volume command (speed) is supported.
Also, you can change midicontrollers in the tracker, using '90' in the panning row:
<pre>
C-3 02 .. .. 0000....
--- .. .. 90 xxyy.... << This will set the value
--- .. .. .. 0000.... of the controller n.'xx' to 'yy' (both in hex)
--- .. .. .. 0000....
</pre>
So "--- .. .. 90 2040...." will set the controller number $20(32) to $40(64).
You will need the midi implementation table of your gear to know what you can change with midi controller messages.
N.B. Not all MIDI devices are created equal!
Although the MIDI specification defines a large range of MIDI messages of various kinds, not every MIDI device is required to work in exactly the same way and respond to all the available messages and ways of working. For example, we don't expect a wind synthesiser to work in the same way as a home keyboard.
Some devices, the older ones perhaps, are only able to respond to a single channel. With some of those devices that channel can be altered from the default of 1 (probably) to another channel of the 16 possible.
Other devices, for instance monophonic synthesisers, are capable of producing just one note at a time, on one MIDI channel. Others can produce many notes spread across many channels.
Further devices can respond to, and transmit, "breath controller" data (MIDI controller number 2 (CC#2)) others may respond to the reception of CC#2 but not be able to create and to send it.
A controller keyboard may be capable of sending "expression pedal" data, but another device may not be capable of responding to that message.
Some devices just have the basic GM sound set. The "voice" or "instrument" is selected using a "Program Change" message on its own.
Other devices have a greater selection of voices, usually arranged in "banks", and the choice of instrument is made by responding to "Bank Select MSB" (MIDI controller 0 (CC#0)), others use "Bank Select LSB" (MIDI controller number 32 (CC#32)), yet others use both MSB and LSB sent one after the other, all followed by the Program Change message. The detailed information about all the different voices will usually be available in a published MIDI Data List.
MIDI Implementation Chart
But in the User Manual there is sometimes a summary of how the device works, in terms of MIDI, in the chart at the back of the manual, the MIDI Implementation Chart.
If you require two devices to work together you can compare the two implementation charts to see if they are "compatible". In order to do this we will need to interpret that chart.
The chart is divided into four columns headed "Function", "Transmitted" (or "Tx"), "Received" (or "Rx"), or more correctly "Recognised", and finally, "Remarks".
<pre>
The left hand column defines which MIDI functions are being described.
The 2nd column defines what the device in question is capable of transmitting to another device.
The 3rd column defines what the device is capable of responding to.
The 4th column is for explanations of the values contained within these previous two columns.
</pre>
There should then be twelve sections, with possibly a thirteenth containing extra "Notes". Finally there should be an explanation of the four MIDI "modes" and what the "X" and the "O" mean.
<pre>
Mode 1: Omni On, Poly;
Mode 2: Omni On, Mono;
Mode 3: Omni Off, Poly;
Mode 4: Omni Off, Mono.
</pre>
O means "yes" (implemented), X means "no" (not implemented).
Sometimes you will find a row of asterisks "**************", these seem to indicate that the data is not applicable in this case. Seen in the transmitted field only (unless you've seen otherwise).
Lastly you may find against some entries an asterisk followed by a number e.g. *1, these will refer you to further information, often on a following page, giving more detail.
Basic Channel
But the very first set of boxes will tell us the "Basic Channel(s)" that the device sends or receives on.
"Default" is what happens when the device is first turned on, "changed" is what a switch of some kind may allow the device to be set to.
For many devices e.g. a GM sound module or a home keyboard, this would be 1-16 for both. That is it can handle sending and receiving on all MIDI channels.
On other devices, for example a synthesiser, it may by default only work on channel 1. But the keyboard could be "split" with the lower notes e.g. on channel 2. If the synth has an arppegiator, this may be able to be set to transmit and or receive on yet another channel.
So we might see the default as "1" but the changed as "1-16".
Modes.
We need to understand Omni On and Off, and Mono and Poly, then we can decipher the four modes.
But first we need to understand that any of these four Mode messages can be sent to any MIDI channel. They don't necessarily apply to the whole device.
If we send an "Omni On" message (CC#125) to a MIDI channel of a device, we are, in effect, asking it to respond to e.g. a Note On / Off message pair, received on any of the sixteen channels. Sound strange? Read it again. Still strange? It certainly is. We normally want a MIDI channel to respond only to Note On / Off messages sent on that channel, not any other. In other words, "Omni Off".
So "Omni Off" (CC#124) tells a channel of our MIDI device to respond only to messages sent on that MIDI channel.
"Poly" (CC#127) is for e.g. a channel of a polyphonic sound module, or a home keyboard, to be able to respond to many simultaneous Note On / Off message pairs at once and produce musical chords.
"Mono" (CC#126) allows us to set a channel to respond as if it were e.g. a flute or a trumpet, playing just one note at a time. If the device is capable of it, then the overlapping of notes will produce legato playing, that is the attack portion of the second note of two overlapping notes will be removed resulting in a "smoother" transition.
So a channel with a piano voice assigned to it will have Omni Off, Poly On (Mode 3), a channel with a saxophone voice assigned could be Omni Off, Mono On (Mode 4).
We call these combinations the four modes, 1 to 4, as defined above.
Most modern devices will have their channels set to Mode 3 (Omni Off, Poly) but be switchable, on a per channel basis, to Mode 4 (Omni Off, Mono).
This second section of data will include first its default value i.e. upon device switch on. Then what Mode messages are acceptable, or X if none.
Finally, in the "Altered" field, how a Mode message that can't be implemented will be interpreted. Usually there will just be a row of asterisks effectively meaning nothing will be done if you try to switch to an unimplemented mode.
Note Number
<pre>
The next row will tell us which MIDI notes the device can send or receive, normally 0-127.
The second line, "True Voice" has the following in the MIDI specification:
"Range of received note numbers falling within the range of true notes produced by the instrument."
My interpretation is that, for instance, a MIDI piano may be capable of sending all MIDI notes (0 to 127) by transposition, but only responding to the 88 notes (21 to 108) of a real piano.
</pre>
Velocity
This will tell us whether the device we're looking at will handle note velocity, and what range from 1-127, or maybe just 64, it transmits or will recognise. So usually "O" plus a range or "X" for not implemented.
After touch
This may have one or two lines two it.
If a one liner the either "O" or "X", yes or no.
If a two liner then it may include "Keys" or "Poly" and "Channel".
This will show whether the device will respond to Polyphonic after touch or channel after touch or neither.
Pitch Bend
Again "O" for implemented, "X" for not implemented.
(Many stage pianos will have no pitch bend capability.)
It may also, in the notes section, state whether it will respond to the full 14 bits, or not, as usually encoded by the pitch bend wheel.
Control Change
This is likely to be the largest section of the chart.
It will list all those controllers, starting from CC#0, Bank Select MSB, which the device is capable of sending, and those that it will respond to using "O" or "X" respectively.
You will, almost certainly, get some further explanation of functionality in the remarks column, or in more detail elsewhere in the documentation.
Of course you will need to know what all the various controller numbers do. Lots of the official technical specifications can be found at the [www.midi.org/techspecs/ MMA], with the table of messages and control change [www.midi.org/techspecs/midimessages.php message numbers]
Program Change
Again "O" or "X" in the Transmitted or Recognised column to indicate whether or not the feature is implemented. In addition a range of numbers is shown, typically 0-127, to show what is available.
True # (number): "The range of the program change numbers which correspond to the actual number of patches selected."
System Exclusive
Used to indicate whether or not the device can send or recognise System Exclusive messages. A short description is often given in the Remarks field followed by a detailed explanation elsewhere in the documentation.
System Common - These include the following:
<pre>
MIDI Time Code Quarter Frame messages (device synchronisation).
Song Position Pointer
Song Select
Tune Request
</pre>
The section will indicate whether or not the device can send or respond to any of these messages.
System Real Time
These include the following:
<pre>
Timing Clock - often just written as "Clock"
Start
Stop
Continue
</pre>
These three are usually just referred to as "Commands" and listed.
Again the section will indicate which, if any, of these messages the device can send or respond to.
<pre>
Aux. Messages
Again "O" or "X" for implemented or not.
Aux. = Auxiliary.
Active Sense = Active Sensing.
</pre>
Often with an explanation of the action of the device.
Notes
The "Notes" section can contain any additional comments to clarify the particular implementation.
Some of the explanations have been drawn directly from the MMA MIDI 1.0 Detailed Specification.
And the detailed explanation of some of the functions will be found there, or in the General MIDI System Level 1 or General MIDI System Level 2 documents also published by the MMA.
OFFICIAL MIDI SPECIFICATIONS
SUMMARY OF MIDI MESSAGES
Table 1 - Summary of MIDI Messages
The following table lists the major MIDI messages in numerical (binary) order (adapted from "MIDI by the Numbers" by D. Valenti, Electronic Musician 2/88, and updated by the MIDI Manufacturers Association.). This table is intended as an overview of MIDI, and is by no means complete.
WARNING! Details about implementing these messages can dramatically impact compatibility with other products. We strongly recommend consulting the official MIDI Specifications for additional information.
MIDI 1.0 Specification
Message Summary Channel Voice Messages [nnnn = 0-15 (MIDI Channel Number 1-16)]
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->1000nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Note Off event.
This message is sent when a note is released (ended). (kkkkkkk) is the key (note) number. (vvvvvvv) is the velocity.
|-
|<!--Status-->1001nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Note On event.
This message is sent when a note is depressed (start). (kkkkkkk) is the key (note) number. (vvvvvvv) is the velocity.
|-
|<!--Status-->1010nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Polyphonic Key Pressure (Aftertouch).
This message is most often sent by pressing down on the key after it "bottoms out". (kkkkkkk) is the key (note) number. (vvvvvvv) is the pressure value.
|-
|<!--Status-->1011nnnn || <!--Data-->0ccccccc 0vvvvvvv || <!--Description-->Control Change.
This message is sent when a controller value changes. Controllers include devices such as pedals and levers. Controller numbers 120-127 are reserved as "Channel Mode Messages" (below). (ccccccc) is the controller number (0-119). (vvvvvvv) is the controller value (0-127).
|-
|<!--Status-->1100nnnn || <!--Data-->0ppppppp || <!--Description-->Program Change. This message sent when the patch number changes. (ppppppp) is the new program number.
|-
|<!--Status-->1101nnnn || <!--Data-->0vvvvvvv || <!--Description-->Channel Pressure (After-touch). This message is most often sent by pressing down on the key after it "bottoms out". This message is different from polyphonic after-touch. Use this message to send the single greatest pressure value (of all the current depressed keys). (vvvvvvv) is the pressure value.
|-
|<!--Status-->1110nnnn || <!--Data-->0lllllll 0mmmmmmm || <!--Description-->Pitch Bend Change. This message is sent to indicate a change in the pitch bender (wheel or lever, typically). The pitch bender is measured by a fourteen bit value. Center (no pitch change) is 2000H. Sensitivity is a function of the receiver, but may be set using RPN 0. (lllllll) are the least significant 7 bits. (mmmmmmm) are the most significant 7 bits.
|}
Channel Mode Messages (See also Control Change, above)
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->1011nnnn || <!--Data-->0ccccccc 0vvvvvvv || <!--Description-->Channel Mode Messages.
This the same code as the Control Change (above), but implements Mode control and special message by using reserved controller numbers 120-127. The commands are:
*All Sound Off. When All Sound Off is received all oscillators will turn off, and their volume envelopes are set to zero as soon as possible c = 120, v = 0: All Sound Off
*Reset All Controllers. When Reset All Controllers is received, all controller values are reset to their default values. (See specific Recommended Practices for defaults) c = 121, v = x: Value must only be zero unless otherwise allowed in a specific Recommended Practice.
*Local Control. When Local Control is Off, all devices on a given channel will respond only to data received over MIDI. Played data, etc. will be ignored. Local Control On restores the functions of the normal controllers.
c = 122, v = 0: Local Control Off
c = 122, v = 127: Local Control On
* All Notes Off. When an All Notes Off is received, all oscillators will turn off.
c = 123, v = 0: All Notes Off (See text for description of actual mode commands.)
c = 124, v = 0: Omni Mode Off
c = 125, v = 0: Omni Mode On
c = 126, v = M: Mono Mode On (Poly Off) where M is the number of channels (Omni Off) or 0 (Omni On)
c = 127, v = 0: Poly Mode On (Mono Off) (Note: These four messages also cause All Notes Off)
|}
System Common Messages
System Messages (0xF0)
The final status nybble is a “catch all” for data that doesn’t fit the other statuses. They all use the most significant nybble (4bits) of 0xF, with the least significant nybble indicating the specific category.
The messages are denoted when the MSB of the second nybble is 1. When that bit is a 0, the messages fall into two other subcategories.
System Common
If the MSB of the second second nybble (4 bits) is not set, this indicates a System Common message. Most of these are messages that include some additional data bytes.
System Common Messages
Type Status Byte Number of Data Bytes Usage
<pre>
Time Code Quarter Frame 0xF1 1 Indicates timing using absolute time code, primarily for synthronization with video playback systems. A single location requires eight messages to send the location in an encoded hours:minutes:seconds:frames format*.
Song Position 0xF2 2 Instructs a sequencer to jump to a new position in the song. The data bytes form a 14-bit value that expresses the location as the number of sixteenth notes from the start of the song.
Song Select 0xF3 1 Instructs a sequencer to select a new song. The data byte indicates the song.
Undefined 0xF4 0
Undefined 0xF5 0
Tune Request 0xF6 0 Requests that the receiver retunes itself**.
</pre>
*MIDI Time Code (MTC) is significantly complex. Please see the MIDI Specification
**While modern digital instruments are good at staying in tune, older analog synthesizers were prone to tuning drift. Some analog synthesizers had an automatic tuning operation that could be initiated with this command.
System Exclusive
If you’ve been keeping track, you’ll notice there are two status bytes not yet defined: 0xf0 and 0xf7. These are used by the System Exclusive message, often abbreviated at SysEx. SysEx provides a path to send arbitrary data over a MIDI connection. There is a group of predefined messages for complex data, like fine grained control of MIDI Time code machinery. SysEx is also used to send manufacturer defined data, such as patches, or even firmware updates.
System Exclusive messages are longer than other MIDI messages, and can be any length. The messages are of the following format:
0xF0, 0xID, 0xdd, ...... 0xF7
The message is bookended with distinct bytes.
It opens with the Start Of Exclusive (SOX) data byte, 0xF0.
The next one to three bytes after the start are an identifier.
Values from 0x01 to 0x7C are one-byte vendor IDs, assigned to manufacturers who were involved with MIDI at the beginning.
If the ID is 0x00, it’s a three-byte vendor ID - the next two bytes of the message are the value.
<pre>
ID 0x7D is a placeholder for non-commercial entities.
ID 0x7E indicates a predefined Non-realtime SysEx message.
ID 0x7F indicates a predefined Realtime SysEx message.
</pre>
After the ID is the data payload, sent as a stream of bytes.
The transfer concludes with the End of Exclusive (EOX) byte, 0xF7.
The payload data must follow the guidelines for MIDI data bytes – the MSB must not be set, so only 7 bits per byte are actually usable. If the MSB is set, it falls into three possible scenarios.
An End of Exclusive byte marks the ordinary termination of the SysEx transfer.
System Real Time messages may occur within the transfer without interrupting it. The recipient should handle them independently of the SysEx transfer.
Other status bytes implicitly terminate the SysEx transfer and signal the start of new messages.
Some inexpensive USB-to-MIDI interfaces aren’t capable of handling messages longer than four bytes.
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->11110000 || <!--Data-->0iiiiiii [0iiiiiii 0iiiiiii] 0ddddddd --- --- 0ddddddd 11110111 || <!--Description-->System Exclusive.
This message type allows manufacturers to create their own messages (such as bulk dumps, patch parameters, and other non-spec data) and provides a mechanism for creating additional MIDI Specification messages. The Manufacturer's ID code (assigned by MMA or AMEI) is either 1 byte (0iiiiiii) or 3 bytes (0iiiiiii 0iiiiiii 0iiiiiii). Two of the 1 Byte IDs are reserved for extensions called Universal Exclusive Messages, which are not manufacturer-specific. If a device recognizes the ID code as its own (or as a supported Universal message) it will listen to the rest of the message (0ddddddd). Otherwise, the message will be ignored. (Note: Only Real-Time messages may be interleaved with a System Exclusive.)
|-
|<!--Status-->11110001 || <!--Data-->0nnndddd || <!--Description-->MIDI Time Code Quarter Frame.
nnn = Message Type
dddd = Values
|-
|<!--Status-->11110010 || <!--Data-->0lllllll 0mmmmmmm || <!--Description-->Song Position Pointer.
This is an internal 14 bit register that holds the number of MIDI beats (1 beat= six MIDI clocks) since the start of the song. l is the LSB, m the MSB.
|-
|<!--Status-->11110011 || <!--Data-->0sssssss || <!--Description-->Song Select.
The Song Select specifies which sequence or song is to be played.
|-
|<!--Status-->11110100 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11110101 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11110110 || <!--Data--> || <!--Description-->Tune Request. Upon receiving a Tune Request, all analog synthesizers should tune their oscillators.
|-
|<!--Status-->11110111 || <!--Data--> || <!--Description-->End of Exclusive. Used to terminate a System Exclusive dump.
|}
System Real-Time Messages
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->11111000 || <!--Data--> || <!--Description-->Timing Clock. Sent 24 times per quarter note when synchronization is required.
|-
|<!--Status-->11111001 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11111010 || <!--Data--> || <!--Description-->Start. Start the current sequence playing. (This message will be followed with Timing Clocks).
|-
|<!--Status-->11111011 || <!--Data--> || <!--Description-->Continue. Continue at the point the sequence was Stopped.
|-
|<!--Status-->11111100 || <!--Data--> || <!--Description-->Stop. Stop the current sequence.
|-
|<!--Status-->11111101 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11111110 || <!--Data--> || <!--Description-->Active Sensing. This message is intended to be sent repeatedly to tell the receiver that a connection is alive. Use of this message is optional. When initially received, the receiver will expect to receive another Active Sensing message each 300ms (max), and if it does not then it will assume that the connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non- active sensing) operation.
|-
|<!--Status-->11111111 || <!--Data--> || <!--Description-->Reset. Reset all receivers in the system to power-up status. This should be used sparingly, preferably under manual control. In particular, it should not be sent on power-up.
|}
Advanced Messages
Polyphonic Pressure (0xA0) and Channel Pressure (0xD0)
Some MIDI controllers include a feature known as Aftertouch. While a key is being held down, the player can press harder on the key. The controller measures this, and converts it into MIDI messages.
Aftertouch comes in two flavors, with two different status messages.
The first flavor is polyphonic aftertouch, where every key on the controller is capable of sending its own independent pressure information. The messages are of the following format:
<pre>
0xnc, 0xkk, 0xpp
n is the status (0xA)
c is the channel nybble
kk is the key number (0 to 127)
pp is the pressure value (0 to 127)
</pre>
Polyphonic aftertouch is an uncommon feature, usually found on premium quality instruments, because every key requires a separate pressure sensor, plus the circuitry to read them all.
Much more commonly found is channel aftertouch. Instead of needing a discrete sensor per key, it uses a single, larger sensor to measure pressure on all of the keys as a group. The messages omit the key number, leaving a two-byte format
<pre>
0xnc, 0xpp
n is the status (0xD)
c is the channel number
pp is the pressure value (0 to 127)
</pre>
Pitch Bend (0xE0)
Many keyboards have a wheel or lever towards the left of the keys for pitch bend control. This control is usually spring-loaded, so it snaps back to the center of its range when released. This allows for both upward and downward bends.
Pitch Bend Wheel
The wheel sends pitch bend messages, of the format
<pre>
0xnc, 0xLL, 0xMM
n is the status (0xE)
c is the channel number
LL is the 7 least-significant bits of the value
MM is the 7 most-significant bits of the value
</pre>
You’ll notice that the bender data is actually 14 bits long, transmitted as two 7-bit data bytes. This means that the recipient needs to reassemble those bytes using binary manipulation. 14 bits results in an overall range of 214, or 0 to 16,383. Because it defaults to the center of the range, the default value for the bender is halfway through that range, at 8192 (0x2000).
Control Change (0xB0)
In addition to pitch bend, MIDI has provisions for a wider range of expressive controls, sometimes known as continuous controllers, often abbreviated CC. These are transmitted by the remaining knobs and sliders on the keyboard controller shown below.
Continuous Controllers
These controls send the following message format:
<pre>
0xnc, 0xcc, 0xvv
n is the status (0xB)
c is the MIDI channel
cc is the controller number (0-127)
vv is the controller value (0-127)
</pre>
Typically, the wheel next to the bender sends controller number one, assigned to modulation (or vibrato) depth. It is implemented by most instruments.
The remaining controller number assignments are another point of confusion. The MIDI specification was revised in version 2.0 to assign uses for many of the controllers. However, this implementation is not universal, and there are ranges of unassigned controllers.
On many modern MIDI devices, the controllers are assignable. On the controller keyboard shown in the photos, the various controls can be configured to transmit different controller numbers. Controller numbers can be mapped to particular parameters. Virtual synthesizers frequently allow the user to assign CCs to the on-screen controls. This is very flexible, but it might require configuration on both ends of the link and completely bypasses the assignments in the standard.
Program Change (0xC0)
Most synthesizers have patch storage memory, and can be told to change patches using the following command:
<pre>
0xnc, 0xpp
n is the status (0xc)
c is the channel
pp is the patch number (0-127)
</pre>
This allows for 128 sounds to be selected, but modern instruments contain many more than 128 patches. Controller #0 is used as an additional layer of addressing, interpreted as a “bank select” command. Selecting a sound on such an instrument might involve two messages: a bank select controller message, then a program change.
Audio & Midi are not synchronized, what I can do ?
Buy a commercial software package but there is a nasty trick to synchronize both. It's a bit hardcore but works for me:
Simply put one line down to all midi notes on your pattern (use Insert key)
and go to 'Misc. Setup', adjust the latency and just search a value
that will make sound sync both audio/midi.
The stock Sin/Saw/Pulse and Rnd waveforms are too simple/common, is there a way to use something more complex/rich ?
You have to ability to redirect the waveforms of the instruments through the synth pipe by selecting the "wav" option for the oscillator you're using for this synth instrument, samples can be used as wavetables to replace the stock signals.
Sound banks like soundfont (sf2) or Kontakt2 are not supported at the moment
====DAW Audio Evolution 4====
Audio Evolution 4 gives you unsurpassed power for digital audio recording and editing on the Amiga. The latest release focusses on time-saving non-linear and non-destructive editing, as seen on other platforms. Besides editing, Audio Evolution 4 offers a wide range of realtime effects, including compression, noise gate, delays, reverb, chorus and 3-band EQ.
Whether you put them as inserts on a channel or use them as auxillaries, the effect parameters are realtime adjustable and can be fully automated. Together with all other mixing parameters, they can even be controlled remotely, using more ergonomic MIDI hardware.
Non-linear editing on the time line, including cut, copy, paste, move, split, trim and crossfade actions
The number of tracks per project(s) is unlimited .... AHI limits you to recording only two at a time. i.e. not on 8 track sound cards like the Juli@ or Phase 88.
sample file import is limited to 16bit AIFF (not AIFC, important distinction as some files from other sources can be AIFC with aiff file extention). and 16bit WAV (pcm only)
Most apps use the Music Unit only but a few apps also use Unit (0-3) instead or as well.
* Set up AHI prefs so that microphone is available. (Input option near the bottom)
stereo++ allows the audio piece to be placed anywhere and the left-right adjusted to sound positionally right
hifi best for music playback if driver supports this option
Load 16bit .aif .aiff only sample(s) to use not AIFC which can have the same ending. AIFF stands for Audio Interchange File Format
sox recital.wav recital.aiff
sox recital.wav −b 16 recital.aiff channels 1 rate 16k fade 3 norm
sox input.wav output.aiff bass −b 16 rate 48k
performs the same format translation, but also applies four effects (down-mix to one channel, sample rate change, fade-in, nomalize), and stores the result at a bit-depth of 16.
rec −c 2 radio.aiff trim 0 30:00
records half an hour of stereo audio
play existing-file.wav
24bit PCM WAV or AIFF do not work
*No stream format handling. So no way to pass on an AC3 encoded stream unmodified to the digital outputs through AHI.
*No master volume handling. Each application has to set its own volume. So each driver implements its own custom driver-mixer interface for handling master volumes, mute and preamps.
*Only one output stream. So all input gets mixed into one output.
*No automatic handling of output direction based on connected cables.
*No monitor input selection. Only monitor volume control.
select the correct input (Don't mistake enabled sound for the correct input.)
The monitor will feedback audio to the lineout and hp out no matter if you have selected the correct input to the ADC. The monitor will provide sound for any valid input. This will result in free mixing when recording from the monitor input instead of mic/line because the monitor itself will provide the hardware mixing for you. Be aware that MIC inputs will give two channel mono. Only Linein will give real stereo.
Now for the not working part. Attempt to record from linein in the AE4 record window, the right channel is noise and the left channel is distorted. Even with the recommended HIFI 16bit Stereo++ mode at 48kHz.
Channels
Monitor
Gain
Inout
Output
Advanced settings - Debugging via serial port
* Options -> Soundcard In/Out
* Options -> SampleRate
* Options -> Preferences
F6 for Sample File List
Setting a grid is easy as is measuring the BPM by marking a section of the sample. Is your kick drum track "not in time" ? If so, you're stumped in AE4 as it has no fancy variable time signatures and definitely no 'track this dodgy rhythm' function like software of the nature of Logic has. So if your drum beat is freeform you will need to work in freeform mode. (Real music is free form anyway).
If the drum *is* accurate and you are just having trouble measuring the time, I usually measure over a range of bars and set the number of beats in range to say 16 as this is more accurate, Then you will need to shift the drum track to match your grid *before* applying the grid. (probably an iterative process as when the grid is active samples snap to it, and when inactive you cannot see it).
AE4 does have ARexx but the functions are more for adding samples at set offsets and starting playback / recording.
These are the usual features found in DAWs...
* Recording digital audio, midi sequencer and mixer
* virtual VST instruments and plug-ins
* automation, group channels, MIDI channels, FX sends and returns, audio and MIDI editors and music notation editor
* different track views
* mixer and track layout (but not the same as below)
* traditional two windows (track and mixer)
Mixing - mixdown
Could not figure out how to select what part I wanted to send to the aux, set it to echo and return. Pretty much the whole echo effect. Or any effect.
Take look at page17 of the manual.
When you open the EQ / Aux send popup window you will see 4 sends. Now from the menu choose the windows menu.
Menus->Windows-> Aux Returns Window
or press F5
You will see a small window with 4 volume controls and an effects button for each. Click a button and add an effects to that aux channel, then set it up as desired (note the reverb effect has a special AUX setting that improves its use with the aux channel, not compulsory but highly useful). You set the amount of 'return' on the main mix in the Aux Return window, and the amount sent from each main mixer channel in the popup for that channel. Again the aux sends are "prefade" so the volume faders on each channel do not affect them.
Tracking
Effects - fade in
To add some echoes to some vocals, tried to add an effect on a track but did not come out. This is made more complicated as I wanted to mute a vocal but then make it echo at the muting point. Want to have one word of a vocal heard and then echoed off. But when the track is mute the echo is cancelled out.
To correctly understand what is happening here you need to study the figure at the bottom of page 15 on the manual. You will see from that that the effects are applied 'prefade' So the automation you applied will naturally mute the entire signal.
There would be a number of ways to achieve the goal,
You have three real time effects slots, one for smoothing like so
Sample -> Amplify -> Delay
Then automate the gain of the amplify block so that it effectively mutes the sample just before the delay at the appropriate moment, the echo effect should then be heard.
Getting the effects in the right order will require experimentation as they can only be added top down and it's not obvious which order they are applied to the signal, but there only two possibilities, so it wont take long to find out.
Using MUTE can cause clicks to the Amplify can be used to mute more smoothly so that's a secondary advantage.
Signal Processing -
Overdub
[[#top|...to the top]]
===Office===
====Spreadsheet Leu====
Support for some xlsx, and ods functions
====Spreadsheet Ignition====
; Needs ABIv1 to be completed before more can be done
File formats supported
* ascii #?.txt and #?.csv (single sheets with data only).
* igs and TurboCalc(WIP) #?.tc for all sheets with data, formats and formulas.
There is '''no''' support for xls, xlsx, ods or uos ([http://en.wikipedia.org/wiki/Uniform_Office_Format Uniform Unified Office Format]) at the moment.
* Always use Esc key after editing Spreadsheet cells.
* copy/paste seems to copy the first instance only so go to Edit -> Clipboard to manage the list of remembered actions.
* Right mouse click on row (1 or 2 or 3) or column header (a or b or c) to access optimal height or width of the row or column respectively
* Edit -> Insert -> Row seems to clear the spreadsheet or clears the rows after the inserted row until undo restores as it should be...
Change Sheet name by Object -> Sheet -> Properties
Click in the cell which will contain the result, and click '''down arrow button''' to the right of the formula box at the bottom of the spreadsheet and choose the function required from the list provided. Then click on the start cell and click on the bottom right corner, a '''very''' small blob, which allows stretching a bounding box (thick grey outlines) across many cells This grey bounding box can be used to '''copy a formula''' to other cells.
Object -> Cell -> Properties to change cell format - Currency only covers DM and not $, Euro, Renminbi, Yen or Pound etc.
Shift key and arrow keys selects a range of cells, so that '''formatting can be done to all highlighted cells'''.
View -> Overview then select ALL with one click (in empty cell in the top left hand corner of the sheet).
Default mode is relative cell referencing e.g. a1+a2 but absolute e.g. $a$1+$a$2 can be entered.
* #sheet-name to '''absolute''' reference another sheet-name cell unless reference() function used.
;Graphs
use shift key and arrow keys to select a bunch of cells to be graph'ed making sure that x axes represents and y axes represents
* value() - 0 value, 1 percent, 2 date, 3 time, 4 unit ...
;Dates
* Excel starts a running count from the 1st Jan 1900 and Ignition starts from 1st Jan 1AD '''(maybe this needs to change)'''
Set formatting Object -> Cell -> Properties and put date in days
;Time
Set formatting Object -> Cell -> Properties and put time in seconds taken
;Database (to be done by someone else)
type - standard, reference (bezug), search criterion (suchkriterium),
* select a bunch of cells and Object -> Database -> Define to set Datenbank (database) and Felder (fields not sure how?)
* Neu (new) or loschen (delete) to add/remove database headings e.g. Personal, Start Date, Finish Date (one per row?)
* Object -> Database -> Index to add fields (felder) like Surname, First Name, Employee ID, etc. to ?
Filtering done with dbfilter(), dbproduct() and dbposition().
Activities with dbsum(), dbaverage(), dbmin() and dbmax().
Table sorting -
;Scripts (Arexx)
;Excel(TM) to Ignition - commas ''',''' replaced by semi-colons ''';''' to separate values within functions
*SUM(),
*AVERAGE(), MAX(), MIN(), INT(), PRODUCT(), MEDIAN(), VAR() becomes Variance(), Percentile(),
*IF(), AND, OR, NOT
*LEFT(), RIGHT(), MID() becomes MIDDLE(), LEN() becomes LENGTH(),
*LOWER() becomes LOWERCASE(), UPPER() becomes UPPERCASE(),
* DATE(yyyy,mm,dd) becomes COMPUTEDATE(dd;mm;yyyy),
*TODAY(), DAY(),WEEK(), MONTH(),=YEAR(TODAY()),
*EOMONTH() becomes MONTHLENGTH(),
*NOW() should be date and time becomes time only, SECOND(), MINUTE(), HOUR(),
*DBSUM() becomes DSUM(),
;Missing and possibly useful features/functions needed for ignition to have better support of Excel files
There is no Merge and Join Text over many cells, no protect and/or freeze row or columns or books but can LOCK sheets, no define bunch of cells as a name, Macros (Arexx?), conditional formatting, no Solver, no Goal Seek, no Format Painter, no AutoFill, no AutoSum function button, no pivot tables, (30 argument limit applies to Excel)
*HLOOKUP(), VLOOKUP(), [http://production-scheduling.com/excel-index-function-most-useful/ INDEX(), MATCH()], CHOOSE(), TEXT(),
*TRIM(), FIND(), SUBSTITUTE(), CONCATENATE() or &, PROPER(), REPT(),
*[https://acingexcel.com/excel-sumproduct-function/ SUMPRODUCT()], ROUND(), ROUNDUP(), *ROUNDDOWN(), COUNT(), COUNTA(), SUMIF(), COUNTIF(), COUNTBLANK(), TRUNC(),
*PMT(), PV(), FV(), POWER(), SQRT(), MODE(), TRUE, FALSE,
*MODE(), LARGE(), SMALL(), RANK(), STDEV(),
*DCOUNT(), DCOUNTA(), WEEKDAY(),
;Excel Keyboard [http://dmcritchie.mvps.org/excel/shortx2k.htm shortcuts needed to aid usability in Ignition]
<pre>
Ctrl Z - Undo
Ctrl D - Fill Down
Ctrl R - Fill right
Ctrl F - Find
Ctrl H - Replace
Ctrl 1 - Formatting of Cells
CTRL SHIFT ~ Apply General Formatting ie a number
Ctrl ; - Todays Date
F2 - Edit cell
F4 - toggle cell absolute / relative cell references
</pre>
====Document Scanning - Scandal====
Scanner usually needs to be connected via a USB port and not via a hub or extension lead.
Check in Trident Prefs -> Devices that the USB Scanner is not bound to anything (e.g. Bindings None)
If not found then reboot the computer and recheck.
Start Scandal, choose Settings from Menu strip at top of screen and in Scanner Driver choose the ?#.device of the scanner (e.g. epson2.device).
The next two boxes - leave empty as they are for morphos SCSI use only
or put ata.device (use the selection option in bigger box below) and Unit as 0 this is needed for gt68xx
* gt68xx - no editing needed in s/gt68xx.conf but needs a firmware file that corresponds to the scanner [http://www.meier-geinitz.de/sane/gt68xx-backend/ gt68xx firmwares] in sys:s/gt68xx.
* epson2 - Need to edit the file epson2.conf in sys/s that corresponds to the scanner being used
'''Save''' the settings but do not press the Use button (aros freezes)
Back to the Picture Scan window and the right-hand sections.
Click on the '''Information''' tab and press Connect button and the scanner should now be detected.
Go next to the '''Scanner''' tab next to Information Tab should have Color, Black and White, etc. and dpi settings now. Selecting an option Color, B/W etc. can cause dpi settings corruption (especially if the settings are in one line) so set '''dpi first'''. Make sure if Preview is set or not.
In the '''Scan''' Tab, press Scan and the scanner will do its duty.
Be aware that nothing is saved to disk yet.
In the Save tab, change format JPEG, PNG or IFF DEEP. Tick incremental and base filename if necessary and then click the Save button. The image will now be saved to permanent storage.
The driver ignores a device if it is already bond to another USB class, rejects it from being usable. However, open Trident prefs, select your device and use the right mouse button to open. Select "NONE" to prevent poseidon from touching the device. Now save settings. It should always work now.
[[#top|...to the top]]
===Emulators===
==== Amiberry ====
==== Amiga Emu - Janus UAE ====
With Amibridge, AROS attempts to make the UAE emulator seem embedded within but it still is acting as an app
There is no dynarec m68k for each hardware that Aros supports or direct patching of motorola calls to AROS hardware accelerated ones unless the emulator has that included
Try starting Janus with a priority of -1 like this little script:
<pre>
cd sys:system/AmiBridge/emulator
changetaskpri -1
run janus-uae -f my_uaerc.config >nil:
cd sys:prefs
endcli
</pre>
This stops Janus hogging all the CPU time.
===Miscellaneous===
====Screensaver Blanker====
Most blankers on the amiga (i.e. aros) run as commodities (they are in the tools/commodities drawer). Double click on blanker.
Control is with an app called Exchange, which you need to run first (double click on app) or run QUIET sys:tools/commodities/Exchange >NIL: but subsequently can use (Cntrl Alt h).
Icon tool types (may be broken) or command line options
<pre>
seconds=number
</pre>
Once the timing is right then add the following to s:icaros-sequence or s:user-startup
e.g. for 5 minutes
run QUIET sys:tools/commodities/Blanker seconds=300 >NIL:
*[http://archives.aros-exec.org/index.php?function=showfile&file=graphics/screenblanker/gblanker.i386-aros.zip Garshneblanker] can make Aros unstable or slow. Certain blankers crashes in Icaros 2.0.x like Dragon, Executor.
*[ Acuario AROS version], the aquarium screen saver.
Startup: extras:acuariofv-aros/acuario
Kill: c:break name=extras:acuariofv-aros/acuario
Managed to start Acuario by the Executor blanker.
<pre>
cx_priority=
cx_popkey= ie CX_POPKEY="Shift F1"
cx_popup=Yes or No
</pre>
<pre>
Qualifier String Input Event Class
---------------- -----------------
"lshift" IEQUALIFIER_LSHIFT
"rshift" IEQUALIFIER_RSHIFT
"capslock" IEQUALIFIER_CAPSLOCK
"control" IEQUALIFIER_CONTROL
"lalt" IEQUALIFIER_LALT
"ralt" IEQUALIFIER_RALT
"lcommand" IEQUALIFIER_LCOMMAND
"rcommand" IEQUALIFIER_RCOMMAND
"numericpad" IEQUALIFIER_NUMERICPAD
"repeat" IEQUALIFIER_REPEAT
"midbutton" IEQUALIFIER_MIDBUTTON
"rbutton" IEQUALIFIER_RBUTTON
"leftbutton" IEQUALIFIER_LEFTBUTTON
"relativemouse" IEQUALIFIER_RELATIVEMOUSE
</pre>
<pre>
Synonym Synonym
String Identifier
------- ----------
"shift" IXSYM_SHIFT /* look for either shift key */
"caps" IXSYM_CAPS /* look for either shift key or capslock */
"alt" IXSYM_ALT /* look for either alt key */
Highmap is one of the following strings:
"space", "backspace", "tab", "enter", "return", "esc", "del",
"up", "down", "right", "left", "f1", "f2", "f3", "f4", "f5",
"f6", "f7", "f8", "f9", "f10", "help".
</pre>
[[#top|...to the top]]
==== World Construction Set WCS (Version 2.031) ====
WCS is a fractal landscape software such as Scenery Animator, Vista Pro and Panorama. Open sourced February 2022, World Construction Set [https://3dnature.com/downloads/legacy-software/ legally and for free] and [https://github.com/AlphaPixel/3DNature c source].
Announced August 1994 this version dates from April 1996 developed by Gary R. Huber and Chris "Xenon" Hanson" from Questar
<pre>
Assign "WCSProjects:" "Volume:Dir/Dir/WCSProjects"
Assign "WCSFrames:" "Volume:Dir/Dir/WCSFrames"
</pre>
<pre>
Load projects .proj by accessing pull down menu Project -> Open then click on CanyonSunset.proj
OK to changing .par file and enlarge Status Log window to show what is happening
Render by pull down menu Modules -> Render with End equal 1 not 300 then click bottom middle button Render
</pre>
[https://www.youtube.com/watch?v=CxQDmf1ZWG0 Youtube walkthrough of above], [], [],
Also try working with the already built file ColoDemo - Then open with the drop-down menu: Project/Open, then WCSProject:ColoDemo.proj
Which allows you to use altimetric DEM files already included and Loading scene parameters from ColoDemo.par
Once this is done, save everything with a new name to start working exclusively on your project.
Then drop-down menu and select Save As ("NewName".proj name), then drop-down menu to open parameter and select Save All ( .par name)
After launching the software, there is a the Module Control Panel composed of five icons.
It is a dock type shortcut of the first few functions of the drop-down menu
*Database - Load (#?.proj), Append, Create, Edit, Save, Dir List (of WCSProject drawer),
*Data Ops - Extract / Convert Interp DEM, Import DLG, DXF, WDB and export LW map 3d formats
*Map View - Database file Loader leading to Map View Control with option to the Database Editor
*Parameters - Editor for Motion, Color, Ecosystem, Clouds, Waves, management of altimeter files DEM, sclock settings etc
*Render - rendering terrain
These are more in the pull down menu but not in the dock
*Motion Editor
*Color Editor
*Ecosys Editor
Simple minimal workflow
*Load database (1st icon - 1st)
*Set parameters and save .par file (4th icon)
*Render scene (5th icon)
[https://www.youtube.com/watch?v=ZbTwwR2qcc4 Youtube], [],
<pre>
.proj new project name which creates a drawer of additional files
.binary array, ascii array .xyz , z buffer, DTED .dt0, vista 1990s dem, iff conversion
.Obj with .elev, .frd with .hdr maps, - digital elevation model (DEM) is a 3D representation of elevation data in various formats
USGS 7.5MinDEM,
.par
</pre>
Since for the time being no project is loaded, a query window indicates a procedural error when clicking on the rendering icon (right end of the bar). The menu is quite traditional; it varies according to the activity of the windows. To display any altimetric file in the "Mapview" (third icon of the panel), There are three possibilities:
* Loading of a demonstration project.
* The import of a DEM file, followed by texturing and packaging from the "Database-Editor" and the "Color-Editor".
* The creation of an altimetric file in WCS format, then texturing.
The altimeter file editing (display in the menu) is only made possible if the "Mapview" window is active.
The software is made up of many windows and won't be able to describe them all. Know that "Color-Editor" and the "Data-Editor" comprise sufficient functions for obtaining an almost real rendering quality. You have the possibility of inserting vector objects in the "Data-Editor" (creation of roads, railways, etc.)
The Map View (MapView) window
*Database - Objects and Topos
*View - Align, Center, Zoom, Pan, Move
*Draw - Maps and distance
*Object - Find, highlight, add points, conform topo, duplicate
*Motion - Camera, Focus, path, elevation
*Windows - DEM designer, Cloud (.cld) and wave (.wve) editor,
You will notice that by selecting this window and simply moving the pointer to various points on the map you will see latitude and longitude values change, along with the height.
Drop-down menu and Modules, then select MapView and change the width of the window with the map to arrange it in the best way on the screen. With the Auto button the center. Window that then displays the contents of my DEM file, in this case the Grand Canyon. MapView allows you to observe the shape of the landscape from above
ZOOM button
Press the Zoom button and then with the pointer position on a point on the map, press the left mouse button and then move to the opposite corner to circumscribe the chosen area and press the left mouse button again, then we will see the enlarged area selected on the map.
Would add that there is a box next to the Zoom button that allows the direct insertion of a value which, the larger it is, the smaller the magnification and the smaller the value, the stronger the magnification. At each numerical change you will need to press the DRAW button to update the view.
PAN button
Under Zoom you will find the PAN button which allows you to move the map at will in all directions by the amount you want. This is done by drawing a line in one direction, then press PAN and point to an area on the map with the pointer and press the left mouse button. At this point, leave it and move the pointer in one direction by drawing a line and press the left mouse button again to trigger the movement of the map on the screen (origin and end points). Do some experiments and then use the Auto button immediately below to recenter everything.
There are parameters such as TOPO, VEC to be left checked and immediately below one that allows different views of the map with the Style command (Single, Multi, Surface, Emboss, Slope, Contour), each with its own particularities to highlight different details.
Now you have the first basics to manage your project visually on the map. Close the MapView window and go further...
Let's start working on ECOSYSTEMS
If we select Emboss from the MapView Style command we will have a clear idea of how the landscape appears, realizing that it is a predominantly desert region of our planet. Therefore we will begin to act on any vegetation present and the appearance of the landscape.
With WCS we will begin to break down the elements of the landscape by assigning defined characteristics. It will be necessary to determine the classes of the ecosystem (Class) with parameters of Elevation Line (maximum altitude), Relative Elevation (arrangement on basins or convexities with respectively positive or negative parameters), Min Slope and Max Slope (slope). WCS offers the possibility of making ecosystems coexist on the same terrain with the UnderEco function, by setting a Density value.
Ecosys Ecosystem Editor
Let's open it from Modules, then Ecosys Editor. In the left pane you will find the list of ecosystems referring to the files present in our project. It will be necessary to clean up that box to leave only the Water and Snow landscapes and a few other predefined ones. We can do this by selecting the items and pressing the Remove button (be careful not for all elements the button is activated, therefore they cannot all be eliminated).
Once this is done we can start adding new ecosystems. Scroll through the various Unused and as soon as the Name item at the top is activated allowing you to write, type the name of your ecosystem, adding the necessary parameters.
<pre>
Ecosystem1: Name: RockBase Class: Rock Density: 80 MinSlope: 15 UnderEco: Terrain
Ecosystem2: Name: RockIncl Clss: Rock Density: 80 MinSlope: 30 UnderEco: Terrain
Ecosystem3: Name: Grass Class Low Veg Density: 50 Height: 1 Elev Line : 1500 Rel El Eff: 5
Max Slope: 10 – Min Slope: 0 UnderEco: Terrain
Ecosistema4: Name: Shrubs Class: Low Veg Density: 40 Height: 8 Elev Line: 3000
Rel El Eff: -2 Max Slope: 20 Min Slope : 5 UnderEco: Terrain
Ecosistema5: Name: Terrain Class: Ground Density: 100 UnderEco: Terrain
</pre>
Now we need to identify an intermediate ecosystem that guarantees a smooth transition between all, therefore we select as Understory Ecosystem the one called Terrain in all ecosystems, except Snow and Water .
Now we need to 'emerge' the Colorado River in the Canyon and we can do this by raising the sea level to 900 (Sea Level) in the Ecosystem called Water.
Please note that the order of the ecosystem list gives priority to those that come after. So our list must have the following order: Water, Snow, Shrubs, RockIncl, RockBase, Terrain. It is possible to carry out all movements with the Swap button at the bottom. To put order you can also press Short List. Press Keep to confirm all the work done so far with Ecosystem Editor.
Remember every now and then to save both the Project 'Modules/Save' and 'Parameter/Save All'
EcoModels are made up of .etp .fgp .iff8 for each model
Color Editor
Now it's time to define the colors of our scene and we can do this by going to Modules and then Color Editor. In the list we focus on our ecosystems, created first.
Let's go to the bottom of the list and select the first white space, assigning the name 'empty1', with a color we like and then we will find this element again in other environments... It could serve as an example for other situations!
So we move to 'grass' which already exists and assign the following colors: R 60 G 70 B50
<pre>
'shrubs': R 60 G 80 B 30
'RockIncl' R 110 G 65 B 60
'RockBase' R 110 G 80 B 80
' Terrain' R 150 G 30 B 30
<pre>
Now we can work on pre-existing colors
<pre>
'SunLight' R 150 G 130 B 130
'Haze and Fog' R 190 G 170 B 170
'Horizon' R 209 G 185 B 190
'Zenith' R 140 G 150 B 200
'Water' R 90 G 125 B 170
</pre>
Ambient R 0 G 0 B 0
So don't forget to close Color Editor by pressing Keep.
Go once again to Ecosystem Editor and assign the corresponding color to each environment by selecting it using the Ecosystem Color button. Press it several times until the correct one appears. Then save the project and parameters again, as done previously.
Motion Editor
Now it's time to take care of the framing, so let's go to Modules and then to Motion Editor. An extremely feature-rich window will open. Following is the list of parameters regarding the Camera, position and other characteristics:
<pre>
-Camera Altitude: 7.0
-Camera Latitude: 36.075
-Camera Longitude: 112.133
-Focus Attitude: -2.0
-Focus Latitude: 36.275
-Focus Longitude: 112.386
-Camera : 512 → rendering window
-Camera Y: 384 → rendering window
-View Arc: 80 → View width in degrees
-Sun Longitude: 172
-Sun Latitude: -0.9
-Haze Start: 3.8
-Haze Range: 78, 5
</pre>
As soon as the values shown in the relevant sliders have been modified, we will be ready to open the CamView window to observe the wireframe preview. Let's not consider all the controls that will appear.
Well from the Motion Editor if you have selected Camera Altitude and open the CamView panel, you can change the height of the camera by holding down the right mouse button and moving the mouse up and down. To update the view, press the Terrain button in the adjacent window. As soon as you are convinced of the position, confirm again with Keep. You can carry out the same work with the other functions of the camera, such as Focus Altitude...
Let's now see the next positioning step on the Camera map, but let's leave the CamView preview window open while we go to Modules to open the window at the same time MapView. We will thus be able to take advantage of the view from the other together with a subjective one.
From the MapView window, select with the left mouse button and while it is pressed, move the Camera as desired. To update the subjective preview, always click on Terrain.
While with the same procedure you can intervene on the direction of the camera lens, by selecting the cross and with the left button pressed you can choose the desired view. So with the pressure of Terrain I update the Preview. Possibly can enlarge or reduce the Map View using the Zoom button, for greater precision.
Also write that the circle around the cameras indicates the beginning of the haze, there are two types (haze and fog) linked to the altitude. Would also add that the camera height is editable through the Motion Editor panel.
The sun
Let's see that changing the position of the sun from the Motion Editor. Press the SUN button at the bottom right and set the time and the date. Longitude and latitude are automatically obtained by the program. Always open the View Arc command from the Motion Editor panel, an item present in the Parameter List box.
Once again confirm everything with Keep and then save again.
Animation
The animation part is not left-back and also occupies a window. The settings possibilities are enormous. A time line with dragging functions ("slide", "drag"...) comparable to that of LightWave completes this window.
A small window is available for positioning the stars as a function of a date, in order to vary the seasons and their various events (and yes...).
At the bottom of the "Motion-Editor", a "cam-view" function will give you access to a control panel. Different preview modes are possible. The rendering is also accessible through a window. No less than nine pages compose it. At this level, you will be able to determine the backup name of your images ("path"), the type of texture to be calculated, the resolution of the images, activate or deactivate functions such as the depth buffer ("zbuffer"), the blur, the background image, etc.
Once all these parameters have been set, all you have to do is click on the "Render" button.
For rendering go to Modules and then Render. Select the resolution, then under IMA select the name of the image. Move to FRA and indicate the level of fractal detail which of 4 is quite good. Then Keep to confirm and then reopen the window, pressing Render you will see the result. The image will be opened with any viewing program.
Strengths:
* Multi-window.
* Quality of rendering.
* Accuracy.
* Opening, preview and rendering on CyberGraphX screen.
* Extract / Convert Interp DEM, Import DLG, DXF, WDB and export LW map 3d formats
* The "zbuffer" function.
Weaknesses:
* No OpenGL management
* Calculation time.
* No network computing tool.
====Writing CD / DVD - Frying Pan====
Can be backup DVDs (4GB ISO size limit due to use of FileInfoBlock), create audio cds from mp3's, and put .iso files on discs
If using for the first time - click Drive button and Device set to ata.device and unit to 0 (zero)
Click Tracks Button - Drive 1 - Create New Disc or Import Existing Disc Image (iso bin/cue etc.) - Session File open cue file
If you're making a data cd, with files and drawers from your hard drive, you should be using the ISO Builder.. which is the MUI page on the left. ("Data/Audio Tracks" is on the right).
You should use the "Data/Audio tracks" page if you want to create music cds with AIFF/WAV/MP3 files, or if you download an .iso file, and you want to put it on a cd.
Click WRITE Button - set write speed - click on long Write button
Examples
Easiest way would be to burn a DATA CD, simply go to "Tracks" page "ISO Builder" and "ADD" everything you need to burn.
On the "Write" page i have "Masterize Disc (DAO)", "Close Disc" and "Eject after Write" set.
One must not "Blank disc before write" if one uses a CDR
AUDIO CD from MP3's are as easy but tricky to deal with. FP only understands one MP3 format, Layer II, everything else will just create empty tracks
Burning bootable CD's works only with .iso files. Go to "Tracks" page and "Data/Audio Tracks" and add the .iso
====odf====
Every ODF file is a collection of several subdocuments within a package (ZIP file), each of which stores part of the complete document.
* content.xml – Document content and automatic styles used in the content.
* styles.xml – Styles used in the document content and automatic styles used in the styles themselves.
* meta.xml – Document meta information, such as the author or the time of the last save action.
* settings.xml – Application-specific settings, such as the window size or printer information.
To read document follow these steps:
* Extracting .ods file.
* Getting content.xml file (which contains sheets data).
* Creating XmlDocument object from content.xml file.
* Creating DataSet (that represent Spreadsheet file).
* With XmlDocument select “table:table” elements, and then create adequate DataTables.
* Parse child’s of “table:table” element and fill DataTables with those data.
* At the end, return DataSet and show it in application’s interface.
To write document follow these steps:
* Extracting template.ods file (.ods file that we use as template).
* Getting content.xml file.
* Creating XmlDocument object from content.xml file.
* Erasing all “table:table” elements from the content.xml file.
* Reading data from our DataSet and composing adequate “table:table” elements.
* Adding “table:table” elements to content.xml file.
* Zipping that file as new .ods file.
XLS file format
The XLS file format contains streams, substreams, and records.
These sheet substreams include worksheets, macro sheets, chart sheets, dialog sheets, and VBA module sheets.
All the records in an XLS document start with a 2-byte unsigned integer to specify Record Type (rt), and another for Count of Bytes (cb). A record cannot exceed 8224 bytes. If larger than the rest is stored in one or more continue records.
* Workbook stream
**Globals substream
***BoundSheet8 record - info for Worksheet substream i.e. name, location, type, and visibility. (4bytes the lbPlyPos FilePointer, specifies the position in the Workbook stream where the sheet substream starts)
**Worksheet substream (sheet) - Cell Table - Row record - Cells (2byte=row 2byte=column 2byte=XF format)
***Blank cell record
***RK cell record 32-bit number.
***BoolErr cell record (2-byte Bes structure that may be either a Boolean value or an error code)
***Number cell record (64-bit floating-point number)
***LabelSst cell record (4-byte integer that specifies a string in the Shared Strings Table (SST). Specifically, the integer corresponds to the array index in the RGB field of the SST)
***Formula cell record (FormulaValue structure in the 8 bytes that follow the cell structure. The next 6 bytes can be ignored, and the rest of the record is a CellParsedFormula structure that contains the formula itself)
***MulBlank record (first 2 bytes give the row, and the next 2 bytes give the column that the series of blanks starts at. Next, a variable length array of cell structures follows to store formatting information, and the last 2 bytes show what column the series of blanks ends on)
***MulRK record
***Shared String Table (SST) contains all of the string values in the workbook.
ACCRINT(), ACCRINTM(), AMORDEGRC(), AMORLINC(),
COUPDAYBS(), COUPDAYS(), COUPDAYSNC(), COUPNCD(), COUPNUM(), COUPPCD(),
CUMIPMT(), CUMPRINC(),
DB(), DDB(), DISC(),
DOLLARDE(), DOLLARFR(),
DURATION(), EFFECT(), FV(), FVSCHEDULE(),
INTRATE(), IPMT(), IRR(), ISPMT(), MDURATION(), MIRR(), NOMINAL(), NPER(), NPV(),
ODDFPRICE(), ODDFYIELD(), ODDLPRICE(), ODDLYIELD(),
PMT(), PPMT(), PRICE(), PRICEDISC(), PRICEMAT(), PV(), RATE(),
RECEIVED(), SLN(), SYD(), TBILLEQ(), TBILLPRICE(), TBILLYIELD(),
VDB(), XIRR(), XNPV(), YIELD(), YIELDDISC(), YIELDMAT(),
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
{{BookCat}}
1ocmnem6b99tde9wrt1t4klj27oxmml
Talk:Diablo Canyon Nuclear Power Plant: The WikiBook
1
252077
4669615
4642932
2026-09-10T16:55:02Z
~2026-49036-93
3625644
/* Bioneers */
4669615
wikitext
text/x-wiki
{{talk header}}
==****************************************************Draft for Comment: Guideline suggestions for contributors**************************************************************************************** ==
This book is a topic which is highly complex and potentially controversial. Thus, it is imperative to follow Wikibooks policies with regard to etiquette, to remain very organized, and to assure quality.
===Quality control===
All assertions should be cited to credible authority at permanent links.
It is recommended to use notes to explain items in addition to using reference citations. The way to do this is to use the ref group="note" tag inside the < brackets.
===Etiquette===
====Government and industry personnel====
Please refrain from characterizing NRC employees, PG&E employees and TEPCO employees in derogatory terms. They are working people, they work hard at what they do, many of them sustain routine lifetime exposures to nuclear radiation which is a sacrifice most people are not required to make. Please do not refer to them as though they were industry shills, apologists, profiteers or evil mad scientists.
====Anti-nuclear critics and protesters====
Please refrain from characterizing dissident scientists, protesters and members of anti-nuclear organizations in derogatory terms. They are concerned citizens, they work hard at what they do, and many of them are deeply concerned that their loved ones and community are not subjected to acute radiation exposures. Please do not refer to them as though they were Luddhites, junk science devotees, fanatics, or conspiracy theorists. ====Factual exceptions====
If you are reporting upon characterizations of either industry supporters or anti-nuclear critics in terms which violate the above guidelines, and you do in fact believe that the evidence in the case indicate that such characterizations may be appropriate AND you are citing primary or secondary sources which allege so, please attempt to attain consensus on the discussion pages and in any case establish the reliability of the characterization in accordance with BLP, NoPersonalAttacks and other appropriate guidelines.[[User:Geofferybard|Geofferybard]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 22:09, 19 May 2011 (UTC)
==== Verification, accuracy and attribution ====
Relevant WB policies:
http://en.wikibooks.org/wiki/Wikibooks:Original_research#Self-verifiable_information
http://en.wikipedia.org/wiki/Wikipedia:Copying_within_Wikipedia#Translating_from_other_language_Wikimedia_Projects
=====Policies on use of content=====
Can I copy-paste if I change the text a little bit?
Further information: Wikipedia:Close paraphrasing
No. It can be tempting to think that if you copy-paste the text and then change it a little bit, that then you're okay. For example you might change "The apple is a crisp, crunchy fruit prized for its nearly clear juice" to "The apple is a crisp, crunchy fruit appreciated for its almost clear juice". Unfortunately, this sort of superficial change is not enough: you must write the article in your own words, and then cite the sources you rely on. If the way in which a source has said something is important, use a quotation, including quote marks and a clear attribution in the text (eg According to John Doe, "The apple is a crisp, crunchy fruit prized for its nearly clear juice").
[edit] What about quotes?
Main page: Wikipedia:Quotations
Brief quotations of copyrighted text may be used to illustrate a point, establish context, or attribute a point of view or idea. Copyrighted text must be attributed and clearly marked as a quote. Extensive quotation of copyrighted text is prohibited even if correctly cited.
[edit] How about copy-pasting from one Wikipedia article to another?
Main page: Wikipedia:Copying within Wikipedia
Yes, you can copy parts of one Wikipedia article into another, but you must link to the source article in your edit summary. Original content contributed by users can be freely used, but only if you recognise the original author – if you don't, this violates their copyright.
However, if you just want to change the title of an article do not copy-paste – use the move tool or make a request at Wikipedia:Requested moves instead.
Source:http://en.wikipedia.org/wiki/Wikipedia:Copy-paste#Can_I_copy-paste_if_I_change_the_text_a_little_bit.3F
===These templates describe policies at WikiCommons===
== {{int:license}} ==
<nowiki>{{PD-USGov}}</nowiki>
<nowiki>{{PD-NOAA}}</nowiki>
=Extensive To Do: Classified Below=
* Create "local" manual of style
* Create import export manual
* Create attributions manual
==Imports==
===Tools===
[[MediaWiki Administrator's Handbook/Importing]]
===External===
[[http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Transwiki/exporting]
] How to export xml and convert to usable import files (maaaybe)[[User:Geofferybard|[[User:Geof Bard गीता]]]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 05:56, 24 May 2011 (UTC)
::'''I actually followed this procedure and got the xml file on my hardrive. Unfortunately, as per [[http://en.wikibooks.org/wiki/Help:Files#Uploading_files]] i would need uploader. Since i am still new at importer i don't know that it is necessarily the humble and unobtrusively polite thing to do to already ask for more. On the other hand, if i construct an elaborate attribution system that someone later does not like, or wants to criticize for some reason, they might say "why didn't you ask for uploader privileges. i suppose my reply would be (1) i was still new as importer and did not want to appear "eager" and (2) my errors on importer have caused some inconveniences to admins who had to fix those errors. (3) uploading could create risks to the wiki since malicious code is sometimes uploaded, even inadvertantly. Thus, anyone reading this is welcome to grant me uploader if they think i should be using this xml method (assuming it works). But i think it is just as well not to bother the admins with another account upgrade so hot on the heels of my last request. So for the time being, i will not put in a renewed uploader request and will use the manual revision history methodologies. If there is disatisfaction with them then we can discuss uploader account priv.''' [[User:Geofferybard|[[User:Geof Bard गीता]]]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 06:29, 24 May 2011 (UTC)
:::Comment for above post:''Tried the xml-upload method to import problematic file but needed local uploader privileged account to do so. since i am still pretty new to import and this wiki i am not proactively requesting uploader right this moment''06:35, 24 May 2011 (UTC)
::::Before posting the above, a new comment:/* ''External */ reiterating prev comment on off chance someone wants to look at uploader for this account. i am pretty much buddhistically detached about it just fine with the manual attrib method, at this point anyway. this comment pasted in also''[[User:Geofferybard|[[User:Geof Bard गीता]]]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 06:35, 24 May 2011 (UTC)
===Problematic import failures===
San Andreas
Earthquake fail 1104 pm[[User:Geofferybard|[[User:Geof Bard गीता]]]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 06:04, 24 May 2011 (UTC)
Fukushima Daiichi nuclear disaster (A very large set of files that seem like they don't want to transwiki)(Finally got it to transwik but only without history. May have to request admin to delete
Transwiki:Fukushima Daiichi nuclear disaster if asking w:admin's to move the w: article...I moved the article over to make room for a new incoming import.)
Fukushima nuclear accident log, March 2011
uranium
uranium oxide
plutonium
radiologic effects on living systems (not the real name)
==Help questions==
===<span style="color: purple;"><b>Weird</b></span>===
http://en.wikibooks.org/wiki/Fukushima_Aftermath:Diablo_Nuclear_Redux?
vs
http://en.wikibooks.org/wiki/Fukushima_Aftermath:_Diablo_Nuclear_Redux?
Note insertion of blank space = different pages.
Identical in terms of both show recent edits on mainspace.
But one has a redlinked discussion page.
Research question: do they show the same edit history?
Do they transclude identically?
Which link from category/stub/subject pages??
===Failed imports log (partial list)===
nuclear fission
==References==
*Nuclear Reactor Analysis, John Wiley & Sons Canada, Ltd.
=Content to add later=
==Context of debate==
===Regional context: nuclear Power in Canada, Mexico and Western states===
Canada has 18 active CANDU reactors operating at five sites, most of them in Ontario, that produce 15 percent of Canada's electricity (and 50% of Ontario's electricity). The Province of Ontario is planning to build another reactor, either at Bruce Nuclear Station or Darlington Nuclear Station.<ref>http://www.raisethehammer.org/blog/2104/fukushima_nuclear_incident_highlights_disaster_management</ref>
==[[/Nuclear policy of the United States/]]==
== Energy policy: debate or deadlock ==
====The problems with coal ====
====The problems with oil ====
====The problems with wind ====
====The problems with solar ====
===The problems with nuclear===
[[File:No nuclear.jpg]]
=== Global climate change===
===Peak oil===
==Key individuals and organizations ==
=== Alliance for Nuclear Responsibility ===
=== Bioneers===
bio engineers are engineers that do engineering on biology life and more that be in more
===Sierra Club===
===SLOMFP===
====Sam Blakeslee====
====Lois Capps====
====Barbara Boxer====
====Diane Fienstein====
====Barack Obama====
=== Venues for public participation ===
====DISC====
====PUC====
====NRC====
====County Boards and Departments ====
===Relicensing===
=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ARCHIVAL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
==Original text is CCL written by WB originating editor, transferred from Japan IMC==
Obviously no copyviol. !!!!
: Text on this page taken from [http://japan.indymedia.org/newswire/display/7713/index.php here]. [[User:Thenub314|Thenub]][[Special:Contributions/Thenub314|314]] ([[User talk:Thenub314|talk]]) 17:41, 18 May 2011 (UTC)
== Archiving customized template used on this book ==
{{tmbox|type=content|text='''A Wikibookian believes this page could be developed from [[{{{http://en.wikipedia.org/wiki/Diablo_Canyon_Power_Plant}}}]] rather than written from scratch.''' It should be imported rather then merely copy/pasted to assure a complete changelog. <br/>Someone with administrative tools may soon perform the import using transwiki tools. '''You can view the baseline article''' at [{http://en.wikipedia.org/w/index.php?title=Diablo_Canyon_Power_Plant&action=history}] which reflects a complete edit history. You may '''view and comment on the request for import''' at [[{{{1}}}]] or, if there is not yet one present, you may '''write a request for import'''.
}}
==Minor technical points and side issues==
"Recent"/recent. There is some question as to whether the shoreline fault was actually only recently discovered or whether it was known,at the least, that there was another earthquake fault near Diablo which had not been officially recognized. Of course, it makes more sense to apell that out and reference it.[[User:Geofferybard|[[User:Geof Bard गीता]]]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 19:46, 23 May 2011 (UTC)
==Old, still-outstanding factual issues ==
NOTE: Because the topic of this book is (a) highly technical and (b) highly controversial, it seems that it would be appropriate to include salient discussion from the other WMF sites which go to the accuracy and reliability issue. [[User:Geofferybard|[[User:Geof Bard गीता]]]] ([[User talk:Geofferybard|discuss]] • [[Special:Contributions/Geofferybard|contribs]]) 19:48, 23 May 2011 (UTC)
===Unit 1 Operation License Expiration Date Inaccurate?===
The article states: "Unit One is a 1,122 MWe pressurized water reactor supplied by Westinghouse. It went online on 2 November 1984 and is licensed to operate through 22 September 2024."
The U.S. Nuclear Regulation Commission states: "The operating license for Unit 1 was issued in November 1984 and it expires in September 2021." [1]
So is the Wiki page wrong or is the NRC page wrong? —Preceding unsigned comment added by Eheitzman (talk • contribs) 11:54, 11 December 2008
Good question. It seems very odd that they'd license the reactor for only 37 years, instead of the normal 40. I've sent a comment to the NRC, so I'll probably hear back in a day or few.
—WWoods (talk) 00:10, Originally posted on wp 12 December 2008 (UTC)
===Styleguide/Introduction/Ommitted===
The following topics are suggested but have been ommitted in this book:
history of the subject,
reasons to learn the subject,
any conventions used in the book,
or any other information that might make sense in an introductory chapter. Common names for such pages are Introduction or About. The latter is more commonly used when information about the book is split from the introduction of the subject matter.
=xxxxxxxxxxxxxxxxxxxxxxxx END OF ARCHIVE XXXXXXXXXXXXXXXXXXXXX=
== "See also w: resources for finding updates! ==
;Ongoing
* [[w:Timeline of the Fukushima I nuclear accidents]]
* [[w:Fukushima 50]]
* [[w:2011 Japanese nuclear accidents]]
* [[w:2011 Tōhoku earthquake and tsunami]]
* [[w:International reaction to Fukushima I nuclear accidents]]
* [[w:Evacuations and Japanese reaction to the Fukushima I nuclear accidents]]
* [[w:Radiation effects from Fukushima I nuclear accidents]]
|
;Nuclear lists
* [[w:List of civilian nuclear accidents]]
* [[w:List of civilian nuclear incidents]]
* [[w:List of civilian radiation accidents]]
* [[w:Lists of nuclear disasters and radioactive incidents]]
* [[w:Japanese nuclear incidents]]
|
;Major earthquakes of Japan
* [[w:1923 Great Kantō earthquake]]
* [[w:Tokai earthquakes]] of 1498, 1605, 1707 and 1854
* [[w:869 Sanriku earthquake and tsunami]] in area around Sendai
* [[w:Great Hanshin Earthquake]] of 1995 near Kobe
* [[w:List of earthquakes in Japan]]
|}
{{BookCat}}
== iMPORTS NEEDED ==
Nuclear reactor technology
Pacific G& E
Epidmeiology of radiologically suspect diseases
== http://openlibrary.org/works/OL10392231W/Empirical_prediction_of_near-source_ground_motion_for_the_Diablo_Canyon_power_plant_site_San_Luis_Obispo_County_California ==
http://openlibrary.org/works/OL10392231W/Empirical_prediction_of_near-source_ground_motion_for_the_Diablo_Canyon_power_plant_site_San_Luis_Obispo_County_Californiahttp://openlibrary.org/works/OL10392231W/Empirical_prediction_of_near-source_ground_motion_for_the_Diablo_Canyon_power_plant_site_San_Luis_Obispo_County_California
== 100% Loose ends ==
* Reorder bottom of title page
**Aggregarte appendixes
*Dewikify Boxer page
*ASK ADRIGNOLA OR QU ABOUT REDIRECT AND SHARING OF A PAGE BY TWO BOOKS ALA PASSIVE NCUCLEAR SAFTY WHICH IS ON THIS BOOK BUT IS A REDIRECT
*READ GOOD BOOK CHECKLIST AND COMPARE HERE
*RENAME
*MOVE SOME MATERIAL TO FUKUSHIMA AFTERMATH
== Orphaned pages ==
Some pages appear to have been left behind when this book was renamed; at any rate, they were lost in the general clutter of renames under the old name. I've moved them all here with prefix <code>/orphaned pages/</code>; see [[Special:PrefixIndex/{{BOOKNAME}}/orphaned pages/]].
09vcsr8ejkqpqxszz3k2jxbxg38eqqj
Compendium of Fiddle Styles/Down on the Bayou
0
254156
4669616
3585334
2026-09-10T17:31:04Z
WereSpielChequers
248949
typo
4669616
wikitext
text/x-wiki
[[File:Michaeldoucet.jpg|thumb]]
Known as "music of the ''veillée'' (evening with company)",<ref>ref name= Balfa|Cajun Fiddle, Old and New: Instruction|Dewey Balfa FW08362|1977|Record Label Folkways Records|Source Archive Smithsonian Center for Folklife and Cultural Heritage|Credits Artist Dewey Balfa | Produced by Tracy Schwarz</ref>< old time Cajun fiddle music is a part of the American fiddle music canon with its own distinctive flair. Its derivation is the borderland of southwest Lousiana and southeast Texas.<ref> M&S</ref>
==Cajun music ==
Cajun music is
Zydeco music is a geographically, culturally and musically related style with Creole roots. But Wiifred Chevis advertises "Foot Stompin Zydeco LP Cajun" so the overlap is real.<ref>http://cgi.ebay.com/WILFRED-CHEVIS-Foot-Stompin-Zydeco-LP-Cajun-Accordion-/120686909566</ref>
WILFRED CHEVIS Foot Stompin Zydeco LP Cajun Accordion
'''Cajun music''', an emblematic music of Louisiana, is rooted in the ballads of the French-speaking Acadians of Canada. Cajun music is often mentioned in tandem with the Louisiana Creole people|Creole-based, Cajun-influenced zydeco form, both of Acadiana origin. These French Louisiana sounds have influenced American popular music for many decades, especially country music, and have influenced pop culture through mass media, such as television commercials. It is an aural tradition dating past the Acadian conquest of southwest Louisiana after their displacement from Nova Scotia, from whence they brought a rich musical tradition.<ref>ref name=LBdB|media=documentary film|title="Les Blues de Balfa" |producer= Yasha Aginsky|url= http://guitarvideos.com/dvd/13020dvd.htm|"We are here to tell you a little bit about what a Cajun is. A Cajun is a person who his homeland was France. Went into Nova Scotia, at the time Acadia, and settled there and was there for about a hundred years, and afterwards the British took over the territory and then the French-speaking people, the French descendants, known as the Acadians, came down to the South-Western part of Louisiana, and that was back in 1755. So over all of these years, your language, and your music has been preserved from daddy to son or daddy to daughter or momma to daughter."|cited en.wikipedia.org/wiki/Dewey_Balfa</ref>
==Repertoire ==
Cajun fiddle includes quadrilles, jigs, hornpipes, reels, one-steps, two-steps, airs, mazurkas, schottisches, and waltzes.<ref>Fiddling in Louisiana|Ron Yule|Original publication 2005 Louisiana Folklife Festival booklet|http://www.louisianafolklife.org/LT/Articles_Essays/LFF_FiddlingInLouisiana.html</ref>
* "Gran Mamou"
* "The Port Arthur Blues" (Leo Soileau,[{Dewey Balfa
* "Ma Chere Maman Creole" Dennis McGee, Dewey Balfa
<ref>ref name= Balfa|Cajun Fiddle, Old and New: Instruction|Dewey Balfa FW08362|1977|Record Label Folkways Records|Source Archive Smithsonian Center for Folklife and Cultural Heritage|Credits Artist Dewey Balfa | Produced by Tracy Schwarz</ref>
* Jambalaya (On the Bayou)|Jambalaya is based on a Cajun melody and has been covered by musicians of all types including Aldus Roger, Jo-El Sonnier and even a 1971 rock version by the young Bruce Springsteen <ref>title=Jambalya|artist=Bruce Springsteen|venue=Newark State College, NJ|date=1971|url=http://www.youtube.com/watch?v=Ac-B_RTxWjE&NR=1</ref>
Hank William's recording is so influential it is covered in and of itself, as by Dwight Yoakam <ref> title=Jambalaya (On the Bayou)|artist=Dwight Yoakum|venue=Red Dog Saloon|June 4, 2000|url=http://www.youtube.com/watch?v=zRkTseiLcbw&NR=1</ref> Others to cover the song included The White Stripes (2005)<ref>http://www.youtube.com/watch?v=-7SS3P3qVBg</ref>and Celtic-influenced rocker Van Morrison. Perhaps its most famous out-of-genre treatment was the interpretation by folk-rocker John Fogerty, notably the live performance at the South Street Seaport, NYC, September 2, 2009. <ref>title=Jambalya|artist=John Fogerty|venu= South Street Seaport, NYC|date=September 2, 2009| guitar= Billy Burnette|fiddle=unknown</ref>
==Roots==
Cajun fiddle style is one of the few extant North American folk music traditions rooted in French chanson <ref> ref name=R&A|Old Time Fiddling Across America|David Reiner and Peter Anick|Mel Bay Publications|Pacific, Missouri|1989</ref> which also includes Quebec and Cape Breton traditions, with which Cajun repertoire shares repertoire. <ref>Bayou Memories: Louisiana French Folk Songs and Dance Tunes Interpreted by Gérard Dôle|Gérard Dôle and Marie-Paule| Vadunthun |FW02625 </ref>
According to Ron Yule "Louisiana fiddling had its birthroots in Europe, with fiddling being noted as early as the 1400s in Scotland".<ref>http://www.louisianafolklife.org/LT/Articles_Essays/LFF_FiddlingInLouisiana.html</ref>
Cajun music is derived from the French speaking Acadian people who had settled in Nova Scotia and been displaced by the British. Blues fiddle has directly influential in the development of Cajun fiddling as with all music in the New Orleans music scene.<ref>Balfa|liner notes|"Les Bars de la Prison"|Dewey Balfa</ref> Double stops in the style of Old time fiddle|Old time fiddlers are commonly heard on Cajun fiddle tracks <ref> Balfa|Drone Sound: "Grand Mamou" (Arr. D. Balfa, Flat Town Music)| Dewey Balfa|0:55 </ref> and even proto-bluegrass influences from early American balladry<ref>Old Lonesome Sound| "La Valse des Bombocheurs"|Dewey Balfa| 2:12 </ref>
==History==
According to Bill Malone and David Sticklin, authors of ''Southern Music/American Music'' <ref>ref name=M&S|Southern music/American music| By Bill C. Malone, David Stricklin|1979</ref>, Cajun music was first discovered commercially in the 1920's with release of ''Allons a' Lafayette'' (Let's Go to Lafayette).
1928 - Cajun fiddle had already diverged into variegenated styles, but the most prominent proponent was Leo Soileau of Ville Platte, Louisiana, who started recording in 1928,with Mayuse Lafleur, accordionist,"who met his death from a stray bullet in a tavern brawl in October of that same year". <ref> M&S, p 61</ref> By the thirties, In the early 1930s, the accordion was pushed into the background by the popular string sounds of the time. mandolins, pianos and banjos joined fiddles to create a jazzy swing beat strongly influenced by Western Swing of neighboring Texas. <ref>en.wikipedia.org/wiki/Cajun_music </ref> The fiddle was a well established instrument which had been the central instrument in Cajun sound until the twenties when it was somewhat eclipsed by the German accordion fad, which had similar effect in French Canada. But in the Depression era the tide turned, and, according to Stricklin et al, it had never been exclipsed. <ref> M& S p 62</ref>
==Proponents of the style==
==Prominent proponents of the style==
*Michael Doucet
*Dewey Balfa
*Doug Kershaw
* Al Berard
*Breaux Brothers
*Hadley Castille
*Harry Choates
* Varise Conner
* Sady Courville
* Luderin Darbone
*Wade Fruge
* J. B. Fuselier
* D'Jalma Garnier
* Gundula Krause
* L'Angélus (band)
*Dennis McGee
* Rufus Thibodeaux
==See also==
[[Ethnography of Fiddle]]
==References==
{{Reflist}}
{{Commons category}}
{{Wikiquote}}
{{BookCat}}
0huzv51yrldzfwbu9p7kukdxgtdu64c
Aros/Platforms/Arm Raspberry Pi support
0
286123
4669642
4669554
2026-09-11T06:36:10Z
Jeff1138
301139
4669642
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager, cursor does not move but with another mouse attached, pointer moves with newest mouse
*3b+ seems to work wifi and ethernet
*4
*400
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio not working as no rt isochronous on usb2otg (white or black) for pi3b and zero 2w but '''working''' on usb3 port (blue) on pi4, 400
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behaviour, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ - work in process
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
spp1ytl8jvulbio7h8l0vc46nlkgis0
4669647
4669642
2026-09-11T08:40:27Z
Jeff1138
301139
4669647
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager, cursor does not move but with another mouse attached, pointer moves with newest mouse
*3b+ seems to work wifi and ethernet
*4
*400
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio not working as no rt isochronous on usb2otg (white or black) for pi3b and zero 2w but '''working''' on usb3 port (blue) on pi4, 400
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behaviour, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ - work in process
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
fn2rhq99u8xqr76suxtlyajc0ecohos
4669648
4669647
2026-09-11T09:00:28Z
Jeff1138
301139
4669648
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager, cursor does not move but with another mouse attached, pointer moves with newest mouse
*3b+ seems to work wifi and ethernet
*4
*400
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio not working as no rt isochronous on usb2otg (white or black) for pi3b and zero 2w but '''working''' on usb3 port (blue) on pi4, 400
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behaviour, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ - work in process
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
02g7xs2eot0k1om19oxhq8yljxahrg7
4669650
4669648
2026-09-11T09:02:16Z
Jeff1138
301139
4669650
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio not working as no rt isochronous on usb2otg (white or black) for pi3b and zero 2w but '''working''' on usb3 port (blue) on pi4, 400
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behaviour, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ - work in process
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
ffabl0q0eqxfi16lmsaafoiodc9i5rg
4669651
4669650
2026-09-11T09:16:17Z
Jeff1138
301139
4669651
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio not working as no rt isochronous on usb2otg (white or black) for pi3b and zero 2w but '''working''' on usb3 port (blue) on pi4, 400
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behaviour, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ - work in process
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
4k3h3aou12j8174zufj01fk2kawukao
4669662
4669651
2026-09-11T10:21:32Z
Jeff1138
301139
4669662
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behaviour, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ - work in process
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
acujgt75avv1g2xyn7ir0s49nyenhfo
4669663
4669662
2026-09-11T10:25:02Z
Jeff1138
301139
4669663
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
sbfazn7b3w2vo2cczaqs3iyw55176sw
4669664
4669663
2026-09-11T10:28:06Z
Jeff1138
301139
4669664
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
n5afp25zya3hrr5khl3skfp92eamxk6
4669665
4669664
2026-09-11T10:33:23Z
Jeff1138
301139
4669665
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] with an [https://eab.abime.net/showthread.php?t=122494&page=51 eab thread] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb]. Odyssey OWB is still work in process
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
a50osvthondf8l3wu9o0tp2nv3ixuoe
4669666
4669665
2026-09-11T10:34:18Z
Jeff1138
301139
4669666
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] with an [https://eab.abime.net/showthread.php?t=122494&page=51 eab thread] is available reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb].
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
q0ea4stwg49sjbn2y1ixl9z1c3aofa3
4669667
4669666
2026-09-11T10:35:20Z
Jeff1138
301139
4669667
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available with an [https://eab.abime.net/showthread.php?t=122494&page=51 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb].
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
eudxvz4cnyey486ovzh6f5dj5mn1xtc
4669668
4669667
2026-09-11T10:41:05Z
Jeff1138
301139
4669668
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available with an [https://eab.abime.net/showthread.php?t=122494&page=51 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb].
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
Summary
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP],
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
b774s7lmkoczu2rb51se5l4lbj0zkck
4669670
4669668
2026-09-11T10:53:49Z
Jeff1138
301139
4669670
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 1Gb+ RAM ideally as you may have to switch to 256Mb gfx mode depending on the application running - it is still a work in progress
Options to boot from using a good power source to prevent the yellow lightning symbol.
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power
nothing else is done especially CSI DSI etc
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
Pi500+ keyboard wedge -
Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok but not great - wifi and lan ethernet testing -
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 (Rev1.0) or D0 (rev1.1)
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with heatsink/fan on 3b to prevent cpu 82C+ throttling
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
'''Download''' [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 builds] [https://sourceforge.net/projects/aros/files/ Alternative site and nightly2] both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd and copied to fat32 8GB+ microSD card (there will be folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 Aros Raspberry pi 3 64bit thread]
Boots with '''USB3''' port based sata3 ssd on Pi400 but untested on Pi4 (may need eeprom update from PiOS or Pi SD Imager) and Pi5
Pi 3 B+ is pre-configured for USB sata3 boot - untested
Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser] is available with an [https://eab.abime.net/showthread.php?t=122494&page=51 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb].
[[File:Wifi00.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi01.png|thumb|Setup wifi on Aros Pi3b]]
[[File:Wifi02.png|thumb|Setup wifi on Aros Pi3b]]
Wifi setup needs the network prefs with the TCP/IP tab click add interface -> change Device to bwfm.device as net0:, IP Mode as DHCP and IPv4
Once you’ve configured the device, simply save the Wireless Networks tab Wi-Fi configuration even if it’s empty. This will create the Wireless.prefs file in the Prefs/Env-Archive/SYS drawer, and should see the Wireless Manager icon in Wanderer. Although a reboot maybe necessary. Wireless tab gets your router settings.
If it does not set to start at boot, settings are preserved. Instead, add this to the user-startup:
<pre>
execute sys:system/network/arostcp/s/startnet
run wirelessmanager device=bwfm.device >nil:
</pre>
Network will start automatically on boot. If you don't want the wirelessmanager icon on Wanderer desktop, just add 'nogui' to the wirelessmanager line
Lan ethernet port on
*lan9514 Pi3b Pi2 no support at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
Summary
*3b ethernet not supported, setup wireless manager (with interface issues)
*3b+ seems to work wifi and ethernet
*4 untested
*400 seems to work wifi and ethernet (with interface issues)
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://forums.raspberrypi.com/viewtopic.php?t=338466 firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
Only the Pi5 has a RTC real time clock, the other Pis will need to use Extras:Networking/utils/ntpsync/ or [https://archives.arosworld.org/index.php?function=browse&cat=network PiNTP] to get the date and time from the internet
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b and zero 2w
*camdusbmidi detects, looking for 64bit ports of [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://github.com/cnvogelg/amiditools amiditools]
Regarding 680x0 emulation, there are several options that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
The status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ PiMiga]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Linux hosted Pi build]
[https://github.com/BlitterStudio/aros-compiler-docker Aros Docker for various systems],
[https://github.com/aros-development-team/AROS/commit/d84b9a337f9aa059154d9af69275935125166bdd Apple Silicon support]
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is significantly different
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback is not affected due to the custom support in the GPU. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
Dual VDP and scalable QPU in VC4
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
=== GPU ===
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS/OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs are a bit weird and far from optimal, especially MorphOS one, because it aims for m68k binary compatibility.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
I have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
So, AROS creates the framebuffer bitmap (I have verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to.
The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*Green BentoIO CMX0 - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued sadly, 3 x Pi4 probably better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry -
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
{{BookCat}}
qo9d9k5f36cv022quq7z00olthmzkro
Coaching Youth Middle Distance Runners
0
289166
4669579
4669494
2026-09-10T12:54:22Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-48940-54|~2026-48940-54]] ([[User talk:~2026-48940-54|talk]]) to last version by Quinlan83
4474502
wikitext
text/x-wiki
{{Featured book}}
{{Reading level|intermediate}}{{mbox-side|type=growth|image=Gnome-mime-application-pdf.svg|msg=A printable '''[[:File:Coaching Youth Middle Distance Runners.pdf|APA Manuscript version]]''' of this work is also available as a PDF file. <small>([[Help:Print versions#PDF versions|info]])</small>}}
This work is a supplementary text for coaches who train athletes aged between 6 and 18 years old to participate in running events between 800 and 5,000 m. It is intended to function as a review of available research in the field and as a set of guidelines on how to apply that research. Topics discussed include nutritional concerns, psychological considerations, effective training methods, and competition strategies. Special attention is given to potential differences between genders. An appendix includes selections for further reading.
* '''[[Coaching Youth Middle Distance Runners/Introduction|Introduction]]'''
* '''[[Coaching Youth Middle Distance Runners/Training|Training]]'''
* '''[[Coaching Youth Middle Distance Runners/Nutrition|Nutrition]]'''
* '''[[Coaching Youth Middle Distance Runners/Competition|Competition]]'''
* '''[[Coaching Youth Middle Distance Runners/Psychology|Psychology]]'''
* '''[[Coaching Youth Middle Distance Runners/Further Reading|Further Reading]]'''
{{Book Search|prefix=Coaching Youth Middle Distance Runners|float=center}}
{{Shelves|Health sciences}}
{{Alphabetical|C}}
{{status|100%}}
__NOTOC__
[[Category:Books with PDF version]]
o0b0001bmweh82tqs5jws89zrgkdk9l
User:Danielravennest/papers/Mars21
2
296327
4669649
4669168
2026-09-11T09:01:08Z
Danielravennest
13526
/* 8.0 - Phase 4: Orbital Locations */
4669649
wikitext
text/x-wiki
{{DISPLAYTITLE:<span style="display:block;text-align:center;font-size:100%;background:#d0f0f0;line-height:2.5em;font-family:'Georgia', serif";">Building Better Worlds in the 21st Century</span>}}
<div style="font-size:125%;font-family:'Georgia', serif;">
:'''Dani Eder,'''
:''The Seed Factory Project,''
:''6485 Rivertown Rd, Fairburn, GA, 30213''
:''email: danielravennest@gmail.com''
:'''Aug 2026'''
'''Note:''' This report is an introduction to the ideas and work of the Seed Factory Project to date, which are covered in more detail in the two volume '''[https://en.wikibooks.org/wiki/Seed_Factories Better Worlds]''' set.
<div class="nonumtoc">{{TOCright}}</div>
=='''0.0 - Summary'''==
 
  National space programs to date have been based on the idea of going to one place at a time, like the Moon and Mars, for reasons like science and national prestige. Missions have finite goals and end when they are reached, so they don't include full development of the destinations. Instead, equipment and supplies have come from Earth, which kept costs high. Limited goals and high cost resulted in poor return on effort.
 Our project proposes a broader approach of upgrading and extending civilization on Earth first, then full development of the entire Solar System, and eventually beyond it. It is based on the idea self-improving production systems that grow from a starter set of core equipment called a '''[http://en.wikibooks.org/wiki/Seed_Factories Seed Factory]'''. Seed factories make more equipment for themselves mostly using local energy and raw materials. This is in addition to making finished products like any other factory.
 Each location follows a growth cycle of self-improvement, making products for local use, trade with the rest of society, and becoming economically self-supporting. Once matured, a location sends elements of new starter sets to new locations. Locations are developed in logical progression from easier to harder and more distant. With proper planning locations can be sustainable, and even reduce unwanted side effects on the environment.
 The very large physical space, materials, and energy resources beyond Earth enable large total returns. Since locations grow to support themselves, the net cost of such a program is only the initial start-up, so the return on effort is high.
 It isn't in the scope of this report to provide detailed plans and hardware designs. What we describe is a possible path that leverages self-improving production methods. This is a step towards solving existing problems and building a better future, but much more work is needed for this idea.
=='''1.0 - Problems of Past Space Programs'''==
 
 Governments have pursued space projects and programs, individually or in groups, for purposes like research, exploration, advancing technology, and prestige. While the results can be large, these efforts often suffer from outdated assumptions, high absolute costs, low relative return on effort, and a focus on single destinations. They have also often not leveraged new knowledge and technology.
:'''Outdated Assumptions'''
 Sending people to the Moon and Mars are stated goals of '''[https://www.space.commerce.gov/policy/national-space-policy/ US National Space Policy]'''. Significant annual budgets are being spent towards these goals, primarily on the '''[https://en.wikipedia.org/wiki/Space_Launch_System Space Launch System]''' and '''[https://en.wikipedia.org/wiki/Orion_(spacecraft) Orion Spacecraft]'''. The program concept to reach these goals is directly descended from plans first made in the mid-20th Century, such as '''[http://launiusr.files.wordpress.com/2011/08/mars_high.jpg Von Braun, 1954]'''. In the decades since, the technologies to be used have advanced, but the overall concept has not. In NASA's '''[https://www.nasa.gov/sites/default/files/atoms/files/journey-to-mars-next-steps-20151008_508.pdf Journey to Mars]''' (pdf file Oct 2015), the "mission" approach includes a number of assumptions:
* It is a round trip for the crew, from Earth to Mars and back, with limited duration on the Martian surface.
* Because the number of missions is small and they are short, it is not economic to develop many local resources.
* Most or all equipment and supplies are launched from Earth.
* High cost limits mission mass. So crews have to accept risks from radiation exposure, equipment failure, and lack of fallback positions.
 Other goals like the Moon and orbiting stations have similar limiting assumptions, and are considered separately from each other.
:'''High Cost'''
 Government-funded and contractor-built space programs have little incentive on either side to finish promptly or keep costs under control. Project-oriented agencies want to continue their existence, but getting approval for new projects is hard. Contractors want to earn as much as possible, but winning new contracts by competitive bidding is uncertain. Politicians who decide on budgets want to preserve jobs in current locations, which works against cost savings.
 The incentives on all sides have led to low cost estimates to get project approval. The tacit understanding is real costs will gradually be revealed as the work progresses. Spent funds deter cancellation as the full costs are revealed, because the funds would then have been wasted on an unfinished project. This pattern avoids frequent approval for a new project or competing for new work. The project schedules are instead stretched to fit real cost to available annual budgets. The result is a few big "can't fail" projects. Public failures risk losing funding or even an agencies' existence. So projects must be conservative, slowing progress.
:'''Low Returns'''
 In terms of exploration and science, a trip going to one place like Mars, and bringing back perhaps a few hundred kg of samples, is not much return for the effort expended. Relatively short round trips do not allow for full exploration of a landing site, much less a planet with the land area of Earth. Lack of refueling stations and reusable vehicles limits sample mass that can be returned to Earth, where researchers and laboratories can fully analyze them.
 If most items have to be launched from the deep gravity well of Earth, then delivery costs will be high, and increase linearly with the number of missions. High transport cost limits weight, and in turn safety features like adequate radiation shielding, backup vehicles, and spare parts and supplies. To minimize risk, what is built must be both lightweight and near-perfect, which is also expensive. Despite that, crew risk is still high in absolute terms. The combination of low return and high cost have delayed going to the the Moon and Mars for decades. Such a program is now moving forward, but very slowly.
:'''Focus on the Moon and Mars'''
 The Moon is nearby, big, and obvious to everyone on Earth. So it was a natural first destination for human exploration. Venus and Mars are the closest major planets. Venus was originally thought a suitable destination because of similarity of orbit, mass, and gravity. However it turned out to be very hot from a thick CO2 atmosphere. Mars then became the next focus of human exploration by being the most Earth-like and nearby destination.
 The focus on Earth-like conditions ignores that on Earth, even the best places require some technology to survive, and more of it to be comfortable and flourish. At a minimum clothing, shelter, and agriculture, are needed, with their underlying technologies. For most of the Earth technology like ships, planes, and snow crawlers are needed to reach places, and more technology if you intend to stay.
 Mars, or anywhere else in space, also require technology to survive and flourish. But Mars does not require dramatically more than harsh places on Earth. For example the temperatures on Mars overlap those of cold places on Earth, such as Siberia and Antarctica. At the same time, the surface of Mars is harder to reach than other regions in space. Getting there needs more work than high orbits near Earth. The colder surface temperatures and 80% lower solar flux require more equipment than near Earth. A primary focus on the Moon and Mars over everywhere else is a mistake. They are large, interesting, and can be useful. So they should be part of future programs, but not to the exclusion of other places.
 A new approach is needed that remedies the problems noted above. It should be based on up-to-date knowledge of the Solar System and new technologies developed since the mid-20th century. It should explore and use all of the many places in the Solar System. That includes the orbital and interplanetary spaces around and between natural objects. Finally, it should have high science and economic returns for the effort expended, including direct returns to people on Earth.
=='''2.0 - New Knowledge and Technologies'''==
 
 Our new approach starts with a modern overview of the Solar System and its resources. We then introduce technologies to access and use those resources. Self-improving production systems that become highly efficient with "Smart Tools" is key among these. Our intent is to use these to benefit civilization and the Earth's environment.
==='''2.1 - The Modern Solar System'''===
 
 The Solar System as of 1950 included 9 planets and their moons, plus about 2,000 asteroids in the belt between Mars and Jupiter. Materials would be available on the surfaces of the Moon and Mars, but required significant fuel to take elsewhere. So they would only be used locally. Energy would come from solar-powered steam turbines, or a little later from fuel cells. These ideas are quite outdated and becoming more so each year.
 Today we can inventory the known Solar System in terms of its material and energy resources. Such '''[https://en.wikipedia.org/wiki/Natural_resource Natural Resources]''' on Earth are well-studied and understood. Most people today know about the Moon, the other major planets, and that some of them also have moons. So here we will mainly review the more recently found and less familiar parts Solar System.
 In terms of resource access, the smaller members of the Solar System all take less energy to land on and remove materials from than Earth. They also have greater surface area relative to mass and lower gravity, making extraction easier.
:'''Material Resources'''
 '''[[w:Near-Earth_object|Near Earth Objects (NEOs)]]''' are those which come closer than 1.3 AU to the Sun, where 1 AU is the Earth's average solar distance. Mars' orbit ranges from 1.38-1.67 AU, so NEO's are "on the way there" in terms of solar distance. In 1950 time there were 55 such objects known, of which only 13 were asteroids. The rest were comets, which are easier to find when they have large tails. The asteroids were ignored because their orbits were not ideal, and mining them was still a subject for science fiction.
 This has changed dramatically. As of August 2026 there are over '''[https://cneos.jpl.nasa.gov/stats/totals.html 42,000 known NEOs]'''. The number has increased exponentially since about 1980 as better telescopes have been used to find them. These searches are partly driven by the impact risk such objects pose to Earth. Of those found so far, 875 are asteroids 1 km or larger in size, a nearly full count. 11,700 are larger than 140 meters out of an estimated 27,000 total. The rest are smaller, with perhaps 4 million to be found larger than 10 meters ([https://iopscience.iop.org/article/10.3847/1538-3881/aa8036 '''Trilling, 2017''']). 124 of them are comets, which lose material when close to the Sun. Just the largest handful of NEOs have a combined mass of 50 trillion tons, which is roughly a thousand years of mining activity on Earth.
 The much larger numbers known today means more of them are in orbits easy to reach from Earth or on the way to Mars. Very efficient '''[https://en.wikipedia.org/wiki/Spacecraft_electric_propulsion Electric Propulsion]''' and other technologies unknown in 1950 time now exist. They make it possible to reach NEOs and work with them remotely from Earth, as recent asteroid and comet probes have done. Early research has been done on '''[https://en.wikipedia.org/wiki/Asteroid_mining Asteroid Mining]''' and '''[https://en.wikipedia.org/wiki/Space_manufacturing Space Manufacturing]''' to make use of their materials. Using NEOs as sources of propellants, supplies, and other products would greatly reduce what you need to bring from Earth for space projects.
 Beyond those that come close to Earth, the '''[https://www.minorplanetcenter.net/mpc/summary Total Number]''' of known objects in the Solar System, as of August 2026, is 1.56 million. This is about 780 times what was known in 1950. The list of such '''[https://en.wikipedia.org/wiki/List_of_minor_planets Minor Planets]''' has grown rapidly as new dedicated telescopes and search techniques were applied, and is expected to increase by another factor of 10 now that the '''[https://en.wikipedia.org/wiki/Vera_C._Rubin_Observatory Rubin Observatory]''' has begun operating.
[[File:Inner_solar_system_objects_top_view_for_wiki.png|thumb|right|600x600px|Figure 2.1-1 - Inner Solar System objects.]]
 91.7% of known objects are in the '''[https://en.wikipedia.org/wiki/Asteroid_belt Main Asteroid Belt]''' between Mars and Jupiter (Figure 2.1-1), but many thousands of others are in orbits throughout the Solar System. The '''[https://minorplanetcenter.net//iau/lists/MPLists.html Minor Planet Center]''' maintains information about all of them. The high proportion in the Asteroid Belt is a function of distance, not absolute numbers. Brightness decreases as square of both distance from the Sun and the telescope. So discoveries are strongly biased to nearby objects, and to only finding the largest ones at greater distances. But total number of objects goes up about 3,500 times when the size goes down by 100 times. So there are many more smaller objects still to be found.
 Many of the objects discovered beyond Neptune, at 30-80 AU, have '''[https://en.wikipedia.org/wiki/Orbital_eccentricity Eccentric Orbits]'''. These objects tend to be found at the close end of their orbits, when they are bright enough to see. This additional discovery bias means there are many more like them waiting to be found, but are currently in more distant parts of their orbits, or never come close enough to find with current telescopes. The August 2026 count of about 8300 such distant objects is limited to those larger than 100 km for the farthest ones. As search methods improve, many more such objects will be found at all distances and more of the smaller ones.
 '''[https://en.wikipedia.org/wiki/List_of_near-parabolic_comets Near-Parabolic Comets]''' can reach distances measured in light-years, or even escape the Solar System entirely. Aside from them, the known size of the Solar System has increased 168 times since 1995, from 49.3 AU for Pluto to 8285 AU for the maximum distance of Centaur object '''[https://minorplanetcenter.net/db_search/show_object?object_id=2015%20FW539&commit=Show 2015 FW539]'''. Some of these objects are quite large (Figure 2.1-2), and there is even a suspected major planet still to be found. Although the absolute distance of these objects is very large, the energy to reach them has a finite limit. The five planetary probes '''[https://en.wikipedia.org/wiki/List_of_artificial_objects_leaving_the_Solar_System Leaving the Solar System]''' already have more energy than needed to reach anything in the Solar System. The practical limit is set by how long it takes to reach and use them.
[[File:Trans-Neptunians_Size_Albedo_Color.svg|thumb|right|512x249px|Figure 2.1-2 - Large Trans-Neptune Objects.]]
 The inventory of Solar System objects is now known to be incomplete, especially for small and distant ones. Despite this, there is detailed knowledge of the history, composition, and geology of some of its members, and this is constantly improving. We expect this to continue, especially from future mass-produced probes with efficient propulsion and refueling capability. Many more objects can then be visited than the current handful per decade. As more is learned about these objects, better plans on how to use them can be made. But even with current knowledge, a start on such plans is possible.
:'''Energy Resources'''
 The Sun is an immense energy source, producing 20 trillion times what human civilization uses today. That energy streams in all directions, not just at the objects which orbit it. Mining and building on the surface of Solar System bodies is convenient, but they typically gather half or less of the available solar energy. This is because of day-night cycles, geography, and in some cases atmospheres and eclipses from other bodies.
 It takes significant energy to move materials from the larger bodies to open space, but once there, solar energy is available up to 100% of the time. For example, with current rockets it takes about 480 MJ (134 kWh) to raise 1 kg from Earth to an orbit in full sunlight. Once there, 1 kg of modern space solar panel can extract that much energy in 56 days, but lasts about 100 times longer. Most solar system bodies are smaller than Earth, and there are more efficient ways to lift materials than today's rockets. So from a net energy standpoint it often makes sense to work in open space.
 Solar cells were only 6% efficient in the mid-20th century, so solar-driven steam turbines were part of the original Mars mission concepts. Solar cells are now 47.6% efficient in the laboratory and 31% for space power applications, and continue to '''[https://en.wikipedia.org/wiki/Solar-cell_efficiency Improve]'''. Using lightweight concentrating reflectors, they can be useful even in the outer Solar System. Where heat, rather than electricity, is needed, direct solar exposure or using mirrors can can reach 80% collection efficiency or higher.
 In addition to solar, there are various energy sources that are more limited in scale and availability. These include nuclear fission and potentially fusion, geothermal, and wind. On Earth we use hydroelectric and chemical combustion, but those are not generally available elsewhere. The orbital motion and gravity fields of bodies are not energy sources, but their potential and kinetic energy can be used in various ways. The Sun's output alone, which will last for billions of years, plus raw materials found all over the Solar System, are enough to sustain civilization and the Earth's environment.
:'''The Illusion of Scarcity'''
 Current civilization is actually quite limited, even on Earth. The urban, forest, and farm land used in any significant way amounts to only 13.5% of the planet's surface. The remainder are oceans, deserts, and ice caps that are only traveled through or barely used. Of the part that is used, the average depth is equivalent to a thin surface layer.
 The world's biosphere (about 2000 Gigtons) plus the human built environment (about 1100 Gigatons) averages about 6 kg/m<sup>2</sup>, while the Earth's total mass to area is 11.71 billion kg/m<sup>2</sup>, or a ratio of one part in 2 billion. At the density of water, the biosphere plus civilization amounts to a 6 mm (1/4 inch) thick layer across the planet's surface. If we only consider the fraction of the planet used, the equivalent thickness is 7.4 times higher, or 4.4 cm (1.75 inches). If this number seems small, it is because most of us live in places that are built up. Life and civilization are very unevenly distributed. Cities and river dams, for example, have much higher built mass per area, while tropical forests can reach 25 times the average biosphere density per area.
 The perceived scarcity of resources is thus an illusion, because we as observers live in the more built up places. Current civilization actually uses only 2 billionths of the planet's mass and one ten-thousandth of the available energy flow. Photosynthesis uses about 13 times more of the available energy, but still only about 1/8% of it. In a literal sense we are only scratching the surface of our own planet. When we consider the whole Solar System, the available resources increase by hundreds of times in mass, and two billion times the energy that reaches Earth.
 A larger fraction of smaller bodies is accessible. On Earth pressure and temperature limits going too deep. Bodies with lower gravity and less hot interiors can be accessed more deeply or all the way through. The much higher total energy across the Solar System would also allow reprocessing and reusing what we consider waste products today. Scarcity would not be a problem if these vast untapped resources could be used.
==='''2.2 - New Technologies'''===
 
 For our approach we want to use the best available production and space technologies, plus some new ones that can be developed in the near future. These include seed factories, production networks, space technologies that are already in use but not yet in government plans, and new ones for space not yet fully developed. This is in addition to more standard existing technology.
:'''Seed Factories'''
 Production systems which use part of their output for self-improvement can grow exponentially. Production can start with simpler tools, but modern technology like computers, communications, automation, robotics, software, and artificial intelligence lets them become more efficient.
 We call a starter set of tools and machines capable of self-improvement using human labor and other energy inputs a '''[https://en.wikibooks.org/wiki/Seed_Factories Seed Factory]'''. They grow to become mature factories by analogy to plant seeds, which grow into mature plants that can produce more seeds. Seed factories can improve in several ways:
* Making parts for additional copies of current equipment.
* Making new types of items not in the starter set, and
* Making different versions of existing equipment (larger, more accurate, etc.).
 While modern technology can reduce the labor needed, some people are still needed today to operate the factory. Like any other factory, some part of its output is for sale or trade. This helps cover the initial cost and paying for items it can't make internally.
 The improvements increase production capacity and the range of products that can be made. Since the capacity to grow increases with the size of the factory, the growth is exponential. The starter or added equipment can include power generation, mining, and materials processing, so the factory can eventually self-supply and self-power from local resources. A seed factory may not use any local sources to start with, but can approach 100% as it matures. Some parts and materials would likely be too hard to make, or too rare locally. So even for a mature factory those would still come from elsewhere.
 When production at a given location is mature enough, it can start supplying parts for, or complete new starter sets. These can be set up in the same area, or sent to new locations, repeating the growth process. Internal growth and making new starter sets highly leverages the initial cost. It fundamentally changes the return/cost ratio of projects for the better.
:'''Locations and MakerNets'''
 When we refer to "locations" we mean a single environment type, with equipment and people that are close enough that they can work together and trade physical items easily. On Earth that might be a single metropolitan area. In less developed places it might be smaller in size from lack of easy local transport. Equipment in a given location may have different owners or control systems, but can still coordinate their work and cooperate on larger projects.
 The collection of coordinating operations forms a network, which we call a '''MakerNet''', after the modern '''[https://en.wikipedia.org/wiki/Maker_culture Maker Subculture]''', who make things. The network has multiple communicating nodes, each of which includes a set of equipment and people who can do tasks. A MakerNet can extend over multiple locations, since data transfer and remote control can operate over long distances at low cost.
 Physical transportation of people and supplies is not as easy, so we distinguish separate locations within a larger network. To the extent local sources can be used, it would lower transport costs. So there is an incentive to ship lightweight items like information over bulk materials.
:'''Space Technologies'''
 New or improved space technologies have been developed since the mid-20th century, but not fully included in existing program plans. These include:
* '''Electric propulsion''' - which uses many times less propellant than chemical rockets. Using large tanks of propellant to deliver relatively small payloads has strongly limited space projects in the past.
* '''Better Materials''' - There are new and significantly improved engineering materials, including high strength fibers, and composite materials that use them. Production methods for them have also improved.
* '''Closed Loop Life Support''' - has been developed which recycles supplies using mechanical equipment or biology.
 Additional technologies that were not specifically developed for space, but can be used for it, include small and powerful computers, their software, other kinds of electronics, robotics, automation, high speed communications, and most recently artificial intelligence (AI) applications.
 Many other space technologies have been proposed, but not yet fully developed. This is either from lack of money and resources, or not enough scale yet to justify them. MakerNets and seed factories can potentially overcome these limitations. Our second volume on '''[https://en.wikibooks.org/wiki/Space_Transport_and_Engineering_Methods Space Systems Engineering]''' collects current and future space technologies that we know of, so they can be considered for future planning and projects. Some new transport examples are ground-based accelerators and air-breathing engines for reaching orbit, and '''[https://en.wikipedia.org/wiki/Skyhook_(structure) Rotating Skyhooks]''' for artificial gravity and orbit transfer.
 
=='''3.0 - New Program Concept'''==
 
 For discussion purposes we refer to this as a program, with component phases and projects. But we do not expect it to be under centralized government direction. Instead it would include independent businesses operated for profit, public/private partnerships, incentive prizes, some government effort, and other project methods.
 This section summarizes our goals and approach. The rest of this report, and our other documents, provide more details. This is a work in progress. It is by no means a finished proposal or a final design. It likely never will be, as the future brings new discoveries and technologies. We have identified new goals and methods, and made a start at the details, but much more work is needed. Our work is open-source, so feel free to build on it, provide feedback, and contribute your own ideas.
:<u>'''Goal 1 - Benefits on Earth'''</u>
 Existing government space program goals are mainly for defense, science, exploration, and national prestige. They have limited budgets because they compete with other government priorities. Our approach is to go beyond these limits, to include the full range of civilized activities, both on Earth and in space. About billion times more people live on Earth right now than in space, and their needs are much larger and more immediate. So our first goal is to address problems on Earth, starting with easier ones, then moving towards the more difficult.
 Competition and the profit motive have often demonstrated faster and cheaper results, so we want to take advantage of them. If there is money to be made, there is a vast pool of capital available beyond government budgets. The $429 billion '''[https://sia.org/news-resources/state-of-the-satellite-industry-report/ Global Space Economy]''' in 2025 was already mostly commercial activity, and 17.6 times NASA's budget.
 The original '''[https://ntrs.nasa.gov/citations/19830007077 1982 Version]''' of the seed factory idea was intended to enable large space projects by production in space. But the laws of nature and how technologies work are the same everywhere. If networks of exponentially improving and multiplying systems can work in space, they will work on Earth too. The operating environments, local raw materials, and energy sources may differ by location, but the underlying principles are the same.
 The early versions of seed factories would most likely be built in higher income areas. These are the easiest places to start because equipment, materials, and energy sources are readily available, as are people who know how to work with them. Conventional jobs have always been at risk from economic and business changes. In the future they may be permanently replaced by the same kinds of advanced technologies seed factories can use. Self-built and self-owned production can supplement or replace conventional work for hire.
 As the owners of production capacity, people can more securely meet their basic needs. They get the benefit of the output regardless of how much labor is replaced by technology. Self-improving systems can grow to mostly copy themselves, so they would become low cost to build. They can also become highly automated and use renewable energy, making them low cost to operate.
 A growing network of productive systems can then be extended to lower income areas on Earth. This allows bypassing fossil fuel development and the problems it creates, while gaining the comforts, health, and safety found in higher income areas. The systems can be further extended to difficult and extreme locations on Earth that are currently unused or barely used. This would lessen scarcity of raw materials, further lowering cost of operation. These expansions and upgrades should be done with planning and care to prevent new environmental side-effects.
 Although we describe a progression from easier to harder locations, a given type of location does not have to be completely developed before starting the next category. Rather, their starting points are staggered in order of difficulty, and their development then continues in parallel.
:<u>'''Goal 2 - Benefits from Space'''</u>
 Economic and environmental reasons are enough for building self-improving systems on Earth. Once experience with them is built up, such systems can then be used in a series of locations in space. There are several reasons for this:
* Access to materials on Earth is limited vertically because temperatures and pressure increase with depth.
* Solar energy in nearby space outside the Earth's shadow averages 7 times more than the Earth's surface because there is no night, weather, or atmospheric absorption. Close orbits range from 0 to 40% shade, so still have at least 4.2 times the available energy
* Different and much larger amounts of materials are accessible, which can be used without affecting the Earth's environment.
* There are a variety of risks to civilization on Earth, both natural and self-created. Some of them can be reduced by projects in and expansion into space.
 So our second goal is to make use of space to bring benefits to Earth, and later extend civilization and the biosphere into the space environment.
 Space projects would logically start with easier and nearby locations, then move to farther and more difficult ones in sequence. Developing a new location begins with imports of equipment and starter materials from Earth or previous locations. Core production and resource extraction is built up, then expands to other kinds of industry. Later deliveries of materials, products, and services helps expand operations.
 Remote control is feasible when distances are short, otherwise command-response times can be long. So some people may be needed on-location to set up and maintain equipment. Suitable locations can build up habitats beyond this for other reasons. Once built up enough, an existing location, along with previous ones, can serve as staging points for the next ones, supplying transportation, starter sets, and other items as needed.
 Space locations vary in environment, raw materials, and energy resources. So a trade network among them and the rest of civilization makes sense, just like it does on Earth. Each location takes advantage of local conditions to do what it can do best, and trade with others as needed. Through trade, locations can become economically self-supporting and not a cost sink for society.
:<u>'''Program Advantages'''</u>
 Our new approach has a number of advantages:
* It addresses the frequent criticism of space programs that there are problems here on Earth that need solving. So we place solving economic and environmental problems first, ahead of large space projects.
* Self-improving and highly automated production lowers the cost of rocket factories and launch sites on Earth. It also lowers how much you need to launch by using local resources already in space. The combined result is much cheaper space projects. Activities that are currently uneconomic can become viable.
* In terms of science and exploration, access to the whole Solar System is better than just the Moon and Mars, as interesting as they may be. Locations develop their local resources, so they can sustain long-term operations, rather than being limited to short term missions and single landing sites.
* A continuing development program much safer than isolated missions. A network of many locations can keep backup supplies and equipment available, and they can be delivered more quickly. Automated and remote controlled transports can deliver supplies and equipment before the first people arrive, and regularly afterwards, providing a buffer against problems.
* Lower production and transport costs means more robust designs can be used. Current space systems minimize weight to save on launch from Earth. Robust designs will have better safety margins, lowering crew risk. Bulk mined materials, either in raw form or as end products, can provide radiation shielding during long missions. Production capacity at the destination, such as the Martian surface, enables making spare parts and replacement supplies on the spot, bypassing long delivery times from Earth.
==='''3.1 - Program Sequence'''===
 
 Our program concept is organized into a number of phases and smaller individual projects. There are several reasons for this:
* The phases have different scales of operation, or use locations with different operating environments, raw materials, and energy resources. They will need different designs suited to them.
* We intend each phase to economically justify itself, and provide revenue and benefits to support later ones. It would take too much funding for such a large program otherwise.
* New technologies need more development before using them for seed factories, makernets, and various space projects. This will not happen all at once. Splitting up the research and development across phases and projects is more manageable.
* We can lay out a long term program now, but we don't know what new technologies will be invented in the future, or when. Later phases can be identified for guidance and direction, but it makes sense to concentrate on the early ones for now. Details of later phases can be left flexible until their time approaches.
[[File:Phase Starts vs Time.png|thumb|right|768x480px|Figure 3.1-1 - Program Phases vs Time.]]
 In general, phases don't end, but rather build on previous ones and operate in parallel once started (Figure 3.1-1). For example, mature industrial factories will continue to operate once new locations are set up elsewhere. The phases have a logical sequence, where later steps generally depend on earlier ones. We have identified seven main ones numbered 0 to 6, shown in different colors, with a number of sub-phases indicated by an added letter (4A, 4B, 4C, ...).
[[File:Program Phases.png|thumb|right|768x480px|Figure 3.1-2 - Logical sequence of program phases.]]
 Figure 3.1-2 diagrams the logical relationship of phases. It does not show all their relationships, since that would make the diagram too complicated to read. Their general order is from easier to harder, and from local to more distant. Each phase typically involves multiple projects and locations. For example Phase 5B - Mars Surface Locations, would eventually include many projects across the planet. Most locations will evolve across time by expansion and upgrade. The phases are summarized in the next two headings (3.2 and 3.3), and then in more detail in report sections 4 through 9 below.
==='''3.2 - Phases 0 to 3: Earth Locations'''===
 
 Our program in the broadest sense changes the goals from specific destinations, like a mission to Mars, to improving and extending civilization and the biosphere throughout the Solar System and beyond. We start with our own planet first, because there are large and immediate needs here. So the first four phases apply to Earth.
 Much of human civilization is unevenly developed and unsustainable, and the vast majority of people will live here for many decades. Starting on Earth allows getting experience with technologies that will later be used in space. It is easier and less expensive to apply them here first, and they can produce economic benefits to sustain themselves.
 This program would widen participation from national space programs, to the much wider base of all of civilization. Government space programs are only about 0.08% of gross world product, and only part of that is devoted to exploration and science beyond Earth. Being more inclusive increases the available inputs for projects, and makes faster progress in the end. The first four phases are:
: <u>'''Phase 0: Research and Development'''</u> - The first major phase performs necessary research and development (R&D) for production technologies to be used on Earth, later adaptions to space, and ones used only in space. It also develops transport, habitation, and service technologies as needed for the particular conditions of different locations. The R&D work is spread out in time according to which phases, locations, and projects particular designs are needed for. Some later R&D, such as testing hardware in the operating environment, would occur in space. Since a lot of production technology already exists on Earth, the earliest R&D will mainly be selection of what to use and in what order. Modified and completely new tech will be worked on later as needed.
: <u>'''Phase 1: Starter Locations & Network'''</u> - This phase builds the first sets of seed factory equipment and begins the self-improvement process. Phase 1 equipment can start small, such as home and hobby use, which makes it affordable. Individual equipment items or small groups of them can be located at home or shared work spaces. A network of people directly or electronically coordinate their work to make items for each other, build new network nodes, and start to accumulate larger shared items. New locations may start with less than full starter sets, and build up to making internal improvements. Phase 1 locations are typically in developed and populated areas with access to the materials, energy sources, and equipment needed.
: <u>'''Phase 2: Distributed and Industrial Locations'''</u> - One of the ways a seed factory can grow is to use existing equipment to make parts for larger ones. This leads from home and hobby size, to small business, commercial, and industrial scale equipment and locations. At smaller scales it is reasonable to gather the full range of equipment and people in one place, and make a wide range of products. At larger scales, the equipment and their operators tend to become more distributed and specialized, and serve larger markets. But they can still coordinate on projects and products.
: <u>'''Phase 3: Difficult and Extreme Locations'''</u> - This phase begins extending life and civilization to the parts of the Earth where there is very little or none today. They are unoccupied partly because the environment conditions are more difficult. Self-improving production allows operating affordably in such places. New systems would be set up and grow serially from moderate to difficult and more extreme environments. Technologies like automation and remote control allows machines to operate where it is not feasible for people to stay.
: A major direction for expansion is vertically, to access additional resources and physical space. This goes beyond the fairly thin current layer of activity near the Earth's surface. We can expand the total active area by 7.4 times, but height can be increased hundreds or thousands of meters both up and down. This enables many times more usable volume and materials.
==='''3.3 - Phases 4-6: Space Locations'''===
 
 The later parts of our program involve developing and using space to benefit Earth. It would be based on experience gained in the earlier phases with self-improving systems, which can make more such systems. It is also based on the larger production capacity developed in Phases 2 and 3. This capacity enables building transport systems like rocket factories and launch sites, and plus equipment and starter sets to be used at the new locations. The experience in working in remote and hostile environments in Phase 3 can also be applied to the remote and hostile environments of space.
 At a civilization level this accesses the much larger physical volume, energy, and material resources beyond Earth. Some heavy industry can eventually be moved to space locations, protecting the Earth's environment. It can also decrease societal risks by, for example, diverting hazardous asteroids, or filter parts of the solar spectrum to reduce overheating the planet.
 As in the earlier phases, we propose a step-by-step approach: extracting local resources, building up core production, diversifying industries, then sending starter sets to the next locations. Locations become physically and economically self-supporting, allowing moving forward to new ones. The three later main phases are:
: <u>'''Phase 4: Orbital Locations'''</u> - Locations in this phase share being in orbit around Earth, or in open space between large bodies. This is in contrast to the the surface or closely bound bound orbits around those bodies. The sub-phases progress from lower to higher Earth orbits, then in distance from the Sun from closer to more distant.
: The main local raw materials are from asteroids and other small bodies, but we can import additional material from Earth, the Moon, and other places. We can also mine a limited amount of the Earth's upper atmosphere and the "debris belt" of discarded space hardware. Solar energy is abundantly available in the open spaces near the Sun, but other solutions become more important in the farther areas. The limit to this phase is the farthest orbits bound to the Sun.
: <u>'''Phase 5: Planetary System Locations'''</u> - These locations are orbits tied by gravity to the Moon, major planets, and their larger moons, or on their respective surfaces. The sub-phases are by distance starting with the Moon, then to the inner and outer planets. Although orbital and planetary locations share features like vacuum or atmospheres we can't breath, they differ in having significant gravity wells or surface gravity, and in having night or time in shadow from the Sun. These differences require different designs, so we place them in a separate phase. Mars is part of this phase, but compared to current space programs it has long-term and larger scale exploration and development, rather than a few short missions to specific spots.
: <u>'''Phase 6: Interstellar Locations'''</u> - The last major phase of extending life and civilization includes the space between stars and locations bound to other stars. This is mostly speculative right now because it is far away in time. A lot new technology will likely be needed, and what will already be developed by then is unknown. But we see no reason to stop just because the edge of our Solar System is reached. For now, technical feasibility limits how far projects can go. But that may change in the future, so we include this final phase as a place-holder, and to provide a direction to plan for.
 
=='''4.0 - Seed Factory Technology'''==
 
 Our program leans heavily on the idea of "seed factories", which are self-improving production systems which grow from starter sets. We note some details in this section, but more on the subject can be found in '''[https://en.wikibooks.org/wiki/Seed_Factories Volume I]''', and in information about '''[https://en.wikibooks.org/wiki/User:Danielravennest/SFP Our Project]''', which is attempting to develop the technology.
 '''Tools and Growth''' - Our ancestors used tools to make more tools at least as far back as the Paleolithic, 2.6 million years ago, when '''[https://en.wikipedia.org/wiki/Hammerstone Hammerstones]''' were used to flake other stones to produce an assortment of tools. Locally found objects like rocks and sticks were likely used even earlier, but left no identifiable evidence. In modern times we use metal-cutting '''[https://en.wikipedia.org/wiki/Machine_tool Machine Tools]''' to make parts for more machine tools, plus all the other kinds of machines used to make other products.
 Any collection of tools and machines can be used the conventional way to provide products and services to others. The income can then be used to buy new equipment. What is new about seed factories is using starter sets purposely designed to make parts for more tools and equipment to improve the set. A starter set can produce its own energy and extract raw materials, or rely on outside supplies to operate. Once set up, the starter set can improve itself internally in several ways:
* <u>Replication</u> - making copies of existing parts and equipment,
* <u>Diversification</u> - making parts for new equipment not in the current set,
* <u>Quality</u> - making items stronger, more accurate, or from different materials, and
* <u>Scaling</u> - making different size parts (usually larger) than the current ones.
 A relatively small starter set can then grow to produce a wide range and large quantity of products. This can optionally include parts for new starter sets. A starter set may not be able to copy most of its original parts at first, because it lacks the right equipment. But after following a planned series of upgrades it can gain the ability to reproduce all or most of the original set. Biological plant seeds follow a similar growth cycle to make more seeds, which is why we call the starter sets "seed factories". Biological plants can even be part of a starter set, such as using trees to provide lumber and also grow more trees.
 The seed factory approach substitutes information, like plans and instructions, for some part of a mature and more capable factory. On Earth this reduces the cost to get started. For space projects it reduces the starting weight and size, making delivery to distant places easier. With modern technology, the information can be stored and transmitted efficiently, and '''Smart Tools''' (software, robots, etc.) can do much of the work. However, growing from a starter set will take more time than immediately building a finished factory.
:'''Self-Replication and Distributed Production'''
 A seed factory is not the same as a '''[https://en.wikipedia.org/wiki/Self-replicating_machine Self-Replicating Machine]'''. First, a number of different materials and production processes are needed to make modern equipment. These are best carried out by separate tools and machines designed for each task. For large-scale production the set of equipment will be closer to commercial building size, and better described as a factory than a single machine.
 Second, a starter set can be much smaller and simpler than the mature factory. We think of it as the seed from which a factory grows. But a plant seed is not the same as the mature plant, so this is not direct replication in the sense of making an exact copy. If a mature factory can produce new starter sets, it is indirect replication by a cycle of growth and then making copies. This is more like plants and animals reproducing by way of smaller and simpler offspring.
 Third, starter sets and the mature factories are not generally able to make everything they need by themselves. At first they will lack all the right equipment. Even when mature there will likely be items too hard to make, or the materials too rare locally. Those need to be supplied from elsewhere. Since they cannot do it all by themselves, they are not fully self-replicating.
 Traditional factories and workshops had to bring the equipment and people to one place, because it was the only way to coordinate the work. With modern computers, software, and communications this is no longer required. Equipment in different places can work together, and people can operate them remotely. So a modern view of factory capacity is the ability to make things on a regular basis. The people and equipment may be in one place for efficiency, but they don't have to be - they can be partly or entirely distributed. What's important is they can work together to make desired products.
:'''Operations and Functions'''
 Production in general involves a number of processes, which turn can require multiple steps. A seed factory may not be able to do all of them at the start, but they can be added in steps as it upgrades. Process categories include:
* <u>Control of operations</u> - collecting data and sending instructions to the various people and equipment.
* <u>Supply power</u> - this includes electricity, thermal heating, and other sources.
* <u>Extract materials</u> - mining and harvesting raw materials.
* <u>Process materials</u> - converting raw materials to usable inventory.
* <u>Fabricate parts</u> - use inventory stock to produce finished parts.
* <u>Storage and protection</u> - house inventory in various stages of production, plus protect equipment and inventory from local conditions when needed.
* <u>Assemble elements</u> - combine finished parts and materials to produce completed products.
* <u>Grow organics</u> - such as food and timber. These can grow on their own given the right conditions, making it different from other kinds of production.
 Most production flows need materials and energy to work with, in addition to tools and machines. In developed areas these can come from outside sources. In less- or undeveloped areas, this may be difficult. Even in developed areas it may be more economic to self-supply. Production systems can start with or build their own mining and processing equipment for materials. They can also start with or build energy sources, such as wind turbines and solar farms.
 Once operating, production generally uses up supplies like lubricants and drill bits, and needs replacements for parts that wear out. These can either be part of the starter set inventory, or supplied from outside as needed. Over time, a growing system can start to make these items for itself. In order to keep growing and improving, a given system has to make or import items faster than old ones wear out. It also needs enough outside supplies of energy, materials, parts, and other items that it can't make internally.
 We don't expect mature factories to reach 100% self-sufficiency. Some items will likely come from other places, in exchange for surplus products and services supplied to others. We also don't expect fully automated production at current levels of industrial technology. Some people will be needed to use the equipment and do tasks only people can do. Those people can be physically present, or in some cases control operations remotely.
 
 
=='''5.0 - Phase 0: Research and Development (R&D)'''==
 
 The rest of this report provides more detail on our program phases and sub-phases. It does not provide complete plans and hardware designs both for length and because they haven't been defined yet. We also can't claim this is the best possible program. We present it as a ''<u>possible</u>'' path that leverages self-improving production methods. Much more work is needed on this idea, and we invite other people to help. Where next steps have been identified, we note them below, in our two volumes on seed factories and space systems, and our other documents.
 A vast amount of knowledge, technology, skills, and products already exist. Where they do, we can simply select and use them. When new arrangements of existing items, or modified or completely new items are needed, '''[https://en.wikipedia.org/wiki/Research_and_development Research and Development]''' (R&D) is the technical method to create them. It is a set of innovative activities undertaken by groups of individuals, corporations, industrialists, or governments. This program phase is numbered zero because it is preparation needed to make the later phases possible. The R&D sub-phases are numbered according to the later phases the work applies to. So sub-phase 0.1 would be R&D work that applies to Phase 1: Starter Locations.
:'''R&D Goals'''
 Our program needs research and development because we are attempting a new way to organize projects using starter sets and self-improvement. This will likely need some new equipment and processes for particular environments, especially those in space. So the goal of this phase is to supply ready-to-use technology and designs. Since R&D is the first program phase, it can't evolve from previous ones. Instead it must start with existing items like buildings, tools, machines, design methods, and skills.
 Developing new locations is not the main purpose of this phase, like it is for later ones. Places like offices, industrial space, and test areas will be needed for the R&D work, but can start with existing ones. In later phases, testing for unique environments may be easier to do in those environments rather than building simulators. So some later R&D work may move to difficult locations on Earth, or to locations in space.
:'''Production by R&D Phase'''
 Some production will happen in the course of setting up R&D locations, testing new equipment designs, and figuring out the best operating flows. But that is not the main goal. Such outputs can be used later, but they are secondary to the main goal to provide usable designs and processes for later phases to use.
 Some of the newly designed equipment that is built for testing may be kept and used internally afterwards. This would help expand and upgrade the R&D locations themselves, and serve as a demonstration of the self-improvement process. Other finished equipment, products, and services generated during R&D can get sold or traded to fund further R&D work. Feedback from practical use of such items can help improve the designs.
 Final designs should have a long operating life if they are to be useful. So early prototypes should aim for longer lives than the time needed to test them. Prototypes with remaining useful lives can be delivered and used in other locations for later phases and projects. Lastly, the R&D phase may produce some final versions of starter set equipment. These can be used directly in later phases.
:'''Sharing Our Results'''
 We want our work to have the most benefit for the most people. So we plan to eventually open-source the designs, so that anyone can use and improve on them. They may be temporarily kept private to help finance additional R&D. In general individual machines, factories, and the products they produce, would be separately owned, either privately or institutionally.
 The R&D Phase may develop new methods and technology to use for itself in the course of working towards later phase designs. We would also make such new developments available for others to use. An example is full resource accounting, a method to track all the inputs and outputs of a system the way financial accounting tracks money. In order for projects to be functional and sustainable, they should account for everything, including scarce resources and all process wastes. If possible these should be recyclable or usable elsewhere, but you can't do that if you don't identify and track them.
:'''R&D Tasks and Projects'''
 The R&D work is divided up according to the later phases and projects that need it. Items used by multiple phases are assigned to the first one they are needed for. Later phases start at different times. So the R&D work for each one is started far enough ahead that it is ready when needed.
 New designs and technology are likely needed even for the last phase. So we expect R&D work will continue for the whole life of our program. In addition to internal R&D work, we expect technology to make progress outside our program. So part of the R&D phase is staying current with outside developments, so that improved designs and methods can be developed within the program later. New and expanded locations within a phase, and unique conditions found there, may require design updates, new hardware models, and customization. Lastly, we expect feedback from using the items in later phases and suggestions for improvements. All of these are reasons to continue the R&D process.
 The R&D work is logically grouped into smaller projects according to the technologies being developed or type of end use. So far we have started this Seed Factory Project to develop the basic ideas for self-improving systems, and started working on what will be needed for Phase 1 locations and networks.
 Future R&D project examples are ocean mining platforms or interplanetary tugs. Such systems would be used in later phases, so we have not yet identified specific ones. There is a lot of science and technology work happening elsewhere in civilization. We do not expect to duplicate that work, but use their results where it makes sense, and contribute back our own results to the general fund of knowledge.
 
=='''6.0 - Moderate Locations'''==
 
 Once the R&D phase starts providing plans, designs, and technology, the core self-improvement methods stay the same in all later phases. But equipment sets must be adapted to local environments, material and energy resources, and available people and their skills. Finished products and services also need to be adapted for local and export use. So our program concept has multiple later phases to account for all these differences.
 Phases 1 and 2 are for the easiest environment conditions, which we call "Moderate". This includes temperatures, water supply, and a number of others. The ranges we consider moderate are listed in section 7.1 which covers conditions that are more difficult. Moderate ones are the kinds of places where most people currently live. Among them are locations with significant population and physical development, such as around cities. These locations have enough people, supply sources, and transportation to get started. So they are the easiest ones to build the first projects in. The three phases/sub-phases for these areas are mainly distinguished by scale of operation. They are phases 1:Starter, 2A: Distributed, and 2B: Industrial.
==='''6.1 - Phase 1: Starter Locations and Network'''===
 
:'''Goals'''
 The main goals of this phase are (1) provide products and services at the personal and community level, (2) develop experience with starter sets and self-improvement, and (3) develop trade networks among people in local sites and different locations. By site we mean an individual place like a home or commercial building, while a location is at the scale of a city or metropolitan area that travel and transport across is reasonably easy. Network members can trade physical items, labor, information, and other items as needed. They can also coordinate work on larger or more complicated projects, despite being in different places.
 Networks would be used in all later phases. This is because (1) locations vary in the material and energy sources available. (2) Individuals and groups have variable skills and interests. They also may not want to travel too far to work on projects. (3) Physical space, utilities, safety, and local rules may limit the work done at a particular site.
:'''Starting Points'''
 Projects in general need Tools, Resources, Energy, and Knowledge to complete. We call this the "TREK" principle for short. Early projects won't have the benefit of a lot of finished R&D work. To start with they can use already developed tools and machines, existing sources of materials and parts, available electric power and fuels, and the many books, online videos, and other information sources on how to do what is needed.
 Early project examples are (1) setting up for a hobby that needs working space and equipment and (2) improvements to an existing home. Such projects don't have to be completed all at once. They can be started with minimal equipment for the first steps, and gradually add more items as skills accumulate. Eventually an owner can start building custom items like a work table or storage for themselves. If they can find other people interested in similar projects they can share knowledge, trade items, and help each other when extra people are needed. Like other parts of our program, people's skills and the equipment they work with are not intended to reach a static end point, but to grow and develop over time. So self-education, training, and practice are encouraged.
 Equipment for this phase starts at the hobby and home use level, for personal and local community products and services. Their duty cycle (percentage of time in operation) is less than full time, and the equipment is smaller and less expensive. This puts the equipment in reach of ordinary people or small groups. Groups of people can afford a number of these smaller items. They can be housed in space they already have, or they can build or rent space without too much difficulty.
 Equipment may be distributed at people's homes, or grouped into clusters on one property, such as a '''[https://en.wikipedia.org/wiki/Hackerspace Community Workshop]''' or small scale production cooperative. Individual sites may be limited in size and cost, but the network as a whole can grow and improve by adding more sites and upgrading existing ones.
:'''Later Improvements'''
 Improvements can come from new R&D work. personal experience, more copies of existing items, scaling to larger (and sometimes smaller) sizes, and purchases funded from sales. As the network expands and upgrades itself, it can produce more items internally for further upgrades, and more products for network use or to sell. Network production can be logically grouped into (1) tools and machines intended to make more tools and machines, (2) items intended for production but not for making more equipment, such as a sawmill or greenhouse, and (3) finished products to be used, traded, or sold, like furniture and food.
 The R&D phase would gradually develop plans, designs, and instructions for starter sets, upgrade paths, and custom equipment. These would be shared as information, and can start to be provided as physical packaged sets. Later projects can then start self-improving faster. A trading network can grow as more sites in more locations are built.
 Examples of future R&D-developed equipment include a 1x2 meter bridge mill, with replaceable heads and bits so it can perform different tasks, and a 15 kW solar furnace with replaceable focus targets. The furnace can directly heat items in a crucible, or generate steam for an electric generator. Such starter set equipment is designed for flexibility, rather than maximum efficiency and speed. That way a smaller starter set can be used for a variety of tasks at lower cost. Later equipment, built with the help of the starter set, can be dedicated to single tasks with higher efficiency and performance. Starter equipment may be supplied finished and ready to operate, as kits with some level of assembly and supplies needed, or purely as plans and instructions.
==='''6.2 - Phase 2A: Distributed Locations'''===
 
:'''Goals'''
 The goals of this phase are (1) increased scale of sites and locations, and (2) relief from job insecurity and displacement by automation.
:'''Evolution'''
 Phase 1 locations in general would accumulate skills and equipment. Some sites within the location will move beyond hobby and home use, towards more regular small business and commercial activity. This involves part or full time operation, and selling more products outside the self-improvement network. The larger scale and more intense uses will need different equipment sets.
 When running a business, speed and efficiency become more important, so equipment is chosen or built to do particular tasks well. This results in a larger collection of more specialized equipment. Skills and training also become more specialized and take longer to learn. Particular sites will tend to do a few things well, and trade for other things they need. A comprehensive large site (general purpose workshop or factory) that does many kinds of work is still possible in this phase, but less common. So working sites will tend to be distributed in multiple places.
 Business and commercial scale operation is not limited to production only, but can also serve the full range of habitation, transport, and service industries. For example, a restaurant is a service business, but it needs a building, furniture, and kitchen equipment first. So the logical progression is from core equipment to make more equipment, then finished products like building materials and furniture, and finally industries that don't produce items, but use them to operate.
:'''Ownership'''
 In the current economic system, separation of ownership and labor results in the problem of job insecurity. The owners of a for-profit business have the incentive to remove workers as soon as possible to save on labor costs. The removal may be due to lower production and sales, or changes in business methods and technology that need less labor or different skills.
 When a person or group has built and expanded their own equipment and business, the owners and workers are the same people. They don't have the same incentive to remove themselves. To the extent they make items for their own use, production would remain constant. If outside sales decrease, they own the equipment to build and start doing something else to make up the difference. Automation is a threat to conventional jobs by needing less labor. But owners who use the same automation for themselves are not threatened with unemployment. Rather they just work less time or more efficiently.
 By diversifying into different industries, self-owned production can integrate with the rest of civilization and be self-supporting. New network members can become owners by first building or buying into a share of core production. They can then use that production to make or trade for what's needed in other industries. Alternately they can start out working for others in their chosen industry, and buy or trade for production shares. Either way they have more security as owners.
==='''6.3 - Phase 2B: Industrial Locations'''===
 
:'''Goals'''
 The main goal of this phase is to reach the most efficient production levels by additional growth in scale and specialization. Industrial locations are in the same kind of developed areas and moderate environments as Phase 2A Distributed Locations, so we group them together under Phase 2.
:'''Growth and Specialization'''
 Industrial sites can evolve from distributed small business or commercial sites by continuing self-improvement and growth. They can also be built as new sites of the final size, where the equipment is supplied by other parts of the network. In that case, supplying the larger equipment and space to house them will likely need outside capital, because individuals or a small group typically won't have enough funds. Gradual evolution from a smaller size by self-production would not require as much, or any, outside funding.
 Larger work spaces with larger input and output flows will tend to limit industrial locations to fewer products. For example, if you are processing scrap metal on an industrial scale into new metal stock, it helps to be near a rail line to transport the scrap and the finished metal. The more products, factory space, and specialized needs you have, the less likely you will find one big site that can satisfy all of them.
 The larger production scale means more outside customers for the products, or larger scale customers. The market area for a site will likely reach beyond a single location, to a region or even world-wide. Since outputs are sold to a wide range of customers at greater distances, transport capacity becomes more important in this phase.
 A narrow product range and large scale markets means demand can be more variable from general economic circumstances or competition. Distributed finance and ownership makes sense in this case. Demand may be low for a particular product, but may be high for something else. In a distributed portfolio these tend to average out. Owners can then reassign their labor and equipment as needed to meet the higher demand products.
 The overall production network has a high capacity to recycle and self-produce what it needs. So modifying equipment to meet changing needs is easier to do. This is a somewhat different business model than investors and workers, with managers in between. It more a network of active owner-operators who can change the mix of what they own and what they produce as needed.
 Like distributed locations, industrial ones can serve the full range of industry types. A combination of industrial, distributed, and individual scale industries can meet most of the needs that people have. If they own their own equipment, or shares in them, because they collectively built and grew them themselves, those needs are met securely, despite higher levels of automation.
=='''7.0 - Other Earth Locations'''==
 
:'''Goal'''
 The main goal of this phase is a better quality of life through sustainable development. The Earth's population is growing, and most people want a better lifestyle. This needs more physical resources and energy. But the Earth is already being stressed by human impact on the environment, and future growth will only increase the stress.
:'''Method'''
 One way out of this dilemma is to produce abundant renewable energy with self-improving systems. These systems make more of themselves exponentially, including more power sources. Renewable energy will have much less impact on the planet's heat balance. Large amounts of energy allow increased reprocessing of wastes, and extraction from lower grade ores or even common rock and ocean water. Rapid expansion brings material goods to the rest of the world faster. Self-production and automation lowers the relative costs of products, energy, and materials.
:'''New Locations'''
 Increased supply of raw materials and energy will likely need access to more difficult and remote locations. So Phase 3 covers working in areas that are thinly or completely uninhabited, or that have difficult or extreme local environments. New designs and processes will be needed for such areas. So a new program phase with added R&D is started.
 Harder conditions are a matter of degree, rather than absolutes with a clear dividing line. Sections 7.1 and 7.2 list the ones we have identified. We define the "normal" (moderate) range as those where the middle 90% of of people live. Difficult and extreme conditions are then significantly above or below the moderate range.
 If at least one of the eleven parameters is well beyond the moderate range, then the location is assigned to the difficult category. Extreme locations are even farther from moderate, and can be hostile to people living and working there. More remote-control and automated operations will tend to be used, instead of trying to build controlled environments for people.
 We want to preserve the Earth's total environment, and the parts that are still in a natural state. So developing the difficult and extreme locations must consider sustainability, renewable energy, and environmental impact. An example would be building offshore fisheries to replace wild fish catches. The latter are putting a strain on the ocean food chain, so it is desirable to minimize that impact. But the fisheries must consider all their inputs and outputs in a total system approach to avoid unintended side-effects.
 The mechanics of building in these locations is somewhat different than previous phases. These areas are less populated, with fewer supply sources and utilities available. So growing from a minimal set of tools and machines is harder to do. Instead, more finished equipment is sent from previous locations to start basic functions like mining and producing energy. A set of production equipment then uses these resources, plus some level of imported supplies, to increase capacity.
 That capacity then supplies products and services for local use. Surplus output is traded with the rest of civilization to make the locations self-supporting economically. Once built up, a location can also contribute to starting additional ones. The experience gained in working in difficult or extreme conditions, working remotely, and building up resource extraction and production in such places will be useful for later phases beyond Earth.
==='''7.1 - Phase 3A: Difficult Earth Locations'''===
 
 We define moderate conditions as those where the middle 90% of the Earth's population lives, with 5% at the upper or lower ends for a given parameter. This definition is somewhat arbitrary, but we think reasonable from a design standpoint. The "Difficult" environments are then those that are at least 10% beyond the moderate range in at least one parameter. 10% is measured either linearly or as a logarithmic factor, depending how wide the normal range is. The parameters and moderate and difficult ranges are:
 '''Temperature''' - This is measured by winter average daily lows and summer average daily highs. The moderate range is 260-310K (-13 to 37C). A given location is likely to exceed either the high or low limit, but not both. The difficult range is therefore below 255K (-18C) or above 315K (42C). Examples of difficult temperatures include Chelyabinsk, Russia, where average winter lows are -19C, and Death Valley, California, where summer highs are up to 47C. The lower limit ie more likely to be reached at high altitudes and latitudes. The high limit is more likely to be reached deep underground, because the Earth's internal temperature rises 25 Kelvin/Celsius on average per kilometer of depth.
 '''Water Supply''' - This is measured by fresh water supply in meters or tons/m^2 per year from rain, rivers, snow, ice, moisture condensation and freshwater aquifers. Salty surface water and aquifers are not included, as they aren't drinkable without desalination. Aquifers are limited to natural replenishment rates, as they are not sustainable if drawn from faster. The moderate range is 0.25 to 2.5 meters/year. Since this is a large range, we use a logarithmic scale, and define difficult as 26% below or above the moderate limits, or <0.185 and >3.15 meters/year. The world's drier deserts fall below the 18.5 cm rainfall level, and places like the east coast of Nicaragua exceed the 315 cm upper limit on rainfall. Too much water is difficult because it can cause problems like flooding, erosion, and decay.
 '''Atmosphere Pressure''' - This is measured by average local air pressure in kiloPascals (kPa). For reference, standard sea-level pressure is 101.325 kPa (14.696 psi). The moderate range is assumed to be from 80-100 kPa (near sea-level to 2000 meters altitude) Difficult pressures are below 70kPa (2750 meters altitude) or above 110 kPa (750 meters below sea-level). These correspond to high mountains or plateaus, and deep underground at low altitudes, since the lowest surface elevation is -413 meters. Low pressures and rapid changes in pressure can cause medical problems for people, so pressure-control is needed where people are. Effects on equipment are mostly minor in this range.
 '''Ground Pressure''' - This is the ground/soil strength at the surface, or surrounding water or rock pressure below the surface, in MegaPascals (MPa). These affect the design of structures, and values that are too low or too high become difficult. For reference, average household floors are designed for 0.275 MPa loads. The moderate range is 0.25 to 2.0 MPa. Difficult conditions are then below 0.19 MPa or above 2.5 MPa. The high limit is reached at ocean depths of 250 meters, and underground at depths of 100 meters in average rock. High surrounding pressures require closed containers to lower them for people, or support structures to prevent collapse. The low limit is reached in open waters (zero strength), fine sand or moist clay (low strengths). Low ground strength requires larger building foundations, or floating construction in the case of open waters
 '''Energy Supply''' - This is measured by average energy supply from renewable natural sources in W/m^2. Wind and solar are available in most places, and are rapidly renewable. Ocean thermal and geothermal are widely available if you go deep enough, but take long periods to renew once depleted, so we only count their renewal rate, not the stored energy. Sources like hydroelectric or tidal energy are not available everywhere, but counted if they are.
 Fossil fuels are not sustainable because of finite supply and the waste products they produce. Biofuels may be produced sustainably. Fuels for nuclear fission and fusion (which is still being developed) are in large enough supply to be considered sustainable but require mining or separation. They can be used to produce energy, but we don't count their contribution to local supply.
 Low energy supply is difficult because some is needed for almost every kind of human activity. If it is not available locally, it must be imported by methods like fuel delivery or power lines. High levels of energy supply are not considered difficult. The range of energy flux is roughly 150 to 900 W/m^2 on Earth, so a difficult low value is 125 W/m^2. Any significant depth below the surface is cut off from wind and solar sources, so are likely to be difficult and require energy supplied from elsewhere.
 '''Gravity Level''' - This is mainly one of the conditions for space environments. On and near the Earth's surface it does not vary by more than 10% unless you are in a centrifuge or accelerating vehicle, so there are no natural places on Earth beyond moderate conditions. Low gravity causes biological problems for people, and may for animals and plants. High gravity is difficult to work in for people, and requires extra structural support for physical items.
 '''Radiation Dose''' - This is measured by unprotected background radiation in milliSeivert (mSv)/year. Industrial exposure, such as to medical imaging staff, or from mining, using, and disposing of radioactive materials, is not considered an environment condition. But such exposure needs its own designs for safety and shielding. Natural background radiation varies by location, according to altitude, magnetic field, and what materials are in the ground below. In most places on Earth it varies from 1 to 13 mSv/year.
 A few places have high radiation levels from concentrations of radioactive elements and their decay products, up to 135 mSv/yr. People have lived in such locations for many generations, with no apparent ill effects. Since adaption may have occurred for long-term residents, we will be conservative and consider high radiation levels a hazard to the general population.
 Levels above 17 mSv/year would be considered difficult. Depending on sources, they might require shielding, sealing, or air circulation. Low radiation levels are not considered hazardous, so background levels below 1 mSv/year are not considered difficult. Note that the human body contains some radioactive elements naturally, so there is no zero background level. Even the highest natural radiation levels on Earth are not significant for most equipment designs.
 '''Ping Time''' - This is the round-trip communication delay to the next nearest 5% of world population, in milliseconds (ms). Long delays create difficulty in voice communications or real-time remote control, and slow down any computer network-based activity. There is no lower limit for this parameter, since short ping times are not a difficult condition.
 On or near the Earth's surface we consider ping times above 100 milliseconds to be difficult, as this much delay starts to be noticeable to people. There are few locations that have such high values to reach 5% of the world's people. The 5% value is because you can choose to do tasks like remote control from reasonably nearby, and not from the farthest place on Earth. This parameter becomes more important in space. The speed of light limits operations to within 15,000 km to stay under 100 ms. That only reaches moderately high Earth orbit, and most of space is far beyond that distance.
 '''Travel Time''' - This is the maximum one-way normal travel time for people, to reach the nearest 5% of other people. Travel time for cargo is assumed to be proportional to that for people. High travel times makes it more difficult and expensive to bring in people with special skills, or necessary parts and materials. Densely populated areas can usually be reached in 5 hours or less. Most of the world's populated areas can be reached within 48 hours, so we set this as the upper limit for moderate (developed) travel. The worst case travel time is 10-20 days for parts of Tibet which lack roads, and ocean locations distant from any airports, requiring ship travel to reach. Very low travel times are not a difficulty, so we set no lower limit for this parameter. We define difficult travel as needing more than 2.5 days.
 '''Stay Time''' - This is the average stay time per person per location, in years. People stay in the same location if they live and sleep there the majority of the time, and make trips to other locations less than half the time. Short stay times are more difficult because of increased transportation needs and staff turnover. The short times may be caused by a harsh environment, lack of habitation and services, or the location is simply undesirable. It can also be caused by a rapidly growing population lowering the average residence time. In that case, the difficulty is caused by having to rapidly build new habitation and services.
 Long stay times are not considered difficult, and their upper limit is the human lifespan. Rapidly growing areas provide the shortest average times on Earth, 7 years if normal turnover is added to growth. Since the upper bound is ~70 years, we will set the difficult limit at 25% below the shortest average, at 5 years. Examples where such low values occur are mining and construction camps in remote locations.
 '''Transport Energy''' - This is the total energy to reach a location from the nearest 5% of population, by the most efficient method, in MegaJoules per kilogram (MJ/kg). For reference, 3.6 MJ = 1 kiloWatt-hour of electricity. Transport energy includes kinetic, potential, and frictional energy. High transport energy is difficult because of increased need for equipment, and their higher cost of operation.
 On Earth, potential and kinetic energy of transport are generally low, and friction dominates. Rail and water transport are currently the most efficient bulk methods, and range from 0.225 to 2.25 MJ/kg between densely and sparsely populated areas. Low transport energy is not considered difficult, but we set values above 2.85 MJ/kg to be. Such values can occur when rail and water transport are not available, and part of the trip must be by less efficient methods. It can also happen when there is a lot of altitude change on the route, increasing frictional losses so as not to exceed speed limits.
 Some of these parameters change with time, due to technology and development. For example, parts of Alaska had long travel times when the only available transport was by dog sled. Once small airplanes and a network of landing fields were available, it became less difficult. It may be a specific goal to upgrade a location to less difficult status, but we define it for phases and R&D by the pre-existing conditions that have to be dealt with.
==='''7.2 - Phase 3B: Extreme Earth Locations'''===
 
 We define extreme locations as an additional 10% beyond the difficult range. This is again in linear or logarithmic amounts, depending on the span of moderate conditions most people live in. The more extreme parameters will need further design modifications, and therefore supporting R&D to develop them. We define no upper bound on how extreme things can get, they are only limited by the natural environment and general state of civilization. The parameter values are:
 '''Temperature''' - average daily lows below 250K (-23C) or average daily highs above 320K (47C). The lows might be found in Antarctica or at high altitudes. The highs are found deep underground or in the hottest deserts.
 '''Water Supply''' - The lower range is less than 0.12 meters/year (4.75 inches), which is a very dry desert. The upper range is more than 3.8 meters/year, which is found in the wettest rain forests.
 '''Atmosphere Pressure''' - The extreme ranges are below 60 kPa or above 120 kPa, which correspond to altitudes above about 5500 meters or below -1600 meters. These correspond to very high mountain tops and deep underground.
 '''Ground Pressure''' - The ranges are below 0.12 MPa or above 3 MPa. These correspond to soft clay or open water at the low end, and depths of 300 meters in water and 120 meters in rock.
 '''Energy Supply''' - The low range is below 90 W/m^2 from wind and solar, which is mainly encountered below the surface. High values of energy supply are not a difficulty.
 '''Gravity Level''' - This parameter does not vary by more than a few percent on Earth, so extreme conditions more than 20% beyond normal do not occur.
 '''Radiation Dose''' - The extreme range is more than 21 mSV/year, which occurs in some natural high radiation areas, or if spending a lot of time (>25%) at high altitude near the magnetic poles, where cosmic radiation can come down vertically.
 '''Ping Time''' - The range for extreme ping time is more than 125 ms round trip. This is nearly around the world at the speed of light, so accessing 5% of the population only takes this long if radio or fiber communications routes are very indirect or unavailable.
 '''Travel Time''' - The range for extreme travel time is more than 3 days to reach. This is found only in very remote areas without conventional transportation.
 '''Stay Time''' - The lower range is average stay times below 3 years 4 months, which mainly would be found in temporary work locations.
 '''Transport Energy''' - The upper range for extreme transport energy is above 3.5 MJ/kg. This is reached mainly when inefficient transportation has to be used.
=='''8.0 - Phase 4: Orbital Locations'''==
 
[[File:Von_Braun_1952_Space_Station_Concept_9132079_original.jpg|thumb|right|640x446px|Figure 8.0-1 - 1952 space station concept by Wernher von Braun and Chesley Bonestell.]]
:'''Goals'''
 The main goals of phases 4 through 6 are using space to bring benefits to Earth, and to help with some long-term problems and risks that can't be handled any other way.
 Figure 8.0-1 is an early concept for a rotating '''[https://en.wikipedia.org/wiki/Space_station Space Station]''', made 5 years before the first orbital launch of Sputnik 1. Note the ring-shaped solar collector on top. This would heat a fluid to produce power, since the first practical silicon solar cell would not be made until 2 years later. We show this concept as a reminder that plans can only be made from what is known at the time. Our approach to developing space may look equally out of date 75 years in the future. Despite that, we have to start somewhere and then make updates as needed.
:'''Approach'''
 This section (8.0) 9.0, and 10.0 cover Phases 4, 5, and 6 in that order. Sub-phases for each are grouped together because they involve working in similar space environments. We expect the various sub-phases to have different starting times due to relative difficulty in reaching their locations and distance from Earth. But once started the sub-phases would overlap and continue in parallel.
 Orbital locations (Phase 4) come first, because Earth orbit has to be reached before going anywhere else in space. Planetary system locations (Phase 5) come next. They share being on or tied by gravity to the larger Solar System bodies other than Earth. Their gravity wells take more work to travel to and from than orbital locations in similar solar orbits. The local environments are also different on and around these bodies. Phase 6 (Interstellar Locations) involves places beyond the Sun's gravitational dominance. It is expected to be last in time. It is hard to predict what technology will be available by then, and how such distant locations would be used. So the last phase is mainly included as a placeholder and to provide some direction for future work.
:'''Current and Near-Term Space Industry'''
 Working on long-term problems doesn't have an immediate economic return. So the first uses of our approach for places beyond Earth would be to support existing and near-term space industry. According the '''[https://orbitalradar.com/how-many-satellites-in-orbit Orbital Radar]''' site there were over 18,000 active satellites orbiting the Earth in September 2026. There were also about 10,700 pieces of debris and leftover rocket parts. There are a smaller number of spacecraft and other items that have been sent beyond Earth orbit, some of which are still operating. The inactive equipment, plus other discarded items and fragments, make up artificial '''[https://en.wikipedia.org/wiki/Space_debris Space Debris]'''. The increasing amount of debris is one of the long-term problems that need solving.
 '''[https://sia.org/news-resources/state-of-the-satellite-industry-report/ Total Economic Activity]''' related to space was $429 billion as of 2025, split between government and private projects. But nearly all of the people involved, and most of the physical tasks, happen on Earth. This provides a starting point for using our self-improvement methods and other advanced technology. In turn that should lower costs.
 Reaching space is generally industrial-scale activity. Rockets themselves are large, and so are the places and equipment to build and launch them. So it would be part of or follow Phase 2B's other industrial locations. What is sent to space can be as small as hobby scale. '''[https://en.wikipedia.org/wiki/Amateur_radio_satellite Amateur Radio Operators]''' have sent satellites into orbit, and well over a thousand '''[https://en.wikipedia.org/wiki/CubeSat Cubesats]''' based on 10 cm modular sizes have been sent to space. Building and operating equipment sent to space more typically ranges from Phase 2A's small business and commercial scale up to the industrial level.
 Reaching space was very expensive until recently because some or all of a rocket was discarded after one use. The high cost limited space activity to large nations or groups of them at first. Over time, commercial space activity has grown to be about 75% of the total. Lower cost transportation and satellite equipment is actively being pursued. The methods include adopting mass production, and discarding less or none of the rocket each flight.
 Most equipment sent to space is also discarded when it fails or reaches the end of its useful life. This adds to the cost of operating in space. Refueling, maintenance, and repair of equipment in space is very limited. New production, upgrades, and recycling is limited to non-existent. Total cost can be lowered by changing how space projects are built, delivered, and operated. In turn this would expand existing uses, and open up new ones like private space stations and space tourism.
:'''Long-Term Sustainability'''
 As of 2025 fossil fuels supplied 81.9% of global primary energy. Since about 1900 their rapid growth powered most of the development of modern civilization. But that comes with a number of unfortunate side effects. They include environmental damage, pollution, and adding greenhouse gases, mainly CO2, to the atmosphere far faster then natural processes remove it.
 These gases reduce infrared radiation back to space, altering the balance between incoming sunlight and outgoing heat. Venus' surface temperature of 462 C (864 F) shows why this is a bad idea. Only 50C of Venus' higher temperature is due to being closer to the Sun. The rest is primarily heat trapped by a thick CO2 atmosphere. Society must transition this century to renewable non-carbon energy sources, so Earth doesn't become more like the hell that Venus is.
 Despite the large-scale use of fossil and other energy sources, current civilization can't afford to capture and reprocess all waste materials, nor extract new materials from abundant low-grade sources. New materials come from '''[https://en.wikipedia.org/wiki/Ore Ores]''' instead. These have higher concentrations of desired products, which take less work to extract. However, high-grade ores are in limited supply. If used materials are not fully reprocessed, those ores will eventually run out. So the current state of civilization is unsustainable. It is heading towards severe problems from increasing temperature, running out of affordable materials, or both.
 At the same time, the world's population is growing, and not everyone has the benefits of high income economies. Full development of such economies would demand even more energy and materials. It's unfair to deny these benefits to some people because others were the first to get them. A growing population with a high standard of living will put more stress on the remaining natural world, and deplete accessible resources faster. Self-improving factories and other advanced technologies can be used to build more renewable energy sources and reprocess more wastes. This would have less impact on Earth, but it would not reduce it to zero.
:'''Civilization-Level Risks'''
 Another problem is preserving civilization and the biosphere in the face of large-scale risks. One such risk is runaway greenhouse warming due to positive feedback loops. This is different than the temperature rising a certain number of degrees from higher CO<sub>2</sub> levels. Melting ice caps can expose darker water or land, increasing the absorbed sunlight and causing further melting. Another feedback loop is release of methane from frozen ocean hydrates and organic matter in permafrost. Methane is a strong greenhouse gas, and so can lead to accelerated release.
 Another risk is from asteroids. Large asteroids fly past Earth fairly frequently, and occasionally hit it, causing widespread damage. There are enough craters, recorded impacts, and near misses to know it is a low probability event, but can be catastrophic if it does. So it is worth trying to reduce that risk. Note that small objects either burn up in the atmosphere or only cause local damage, and don't require civilization-level action to prevent.
 There are other large-scale risks besides these two. Examples include '''[https://en.wikipedia.org/wiki/Supervolcano Supervolcano]''' eruptions, genetically engineered plagues, and nuclear war. It is worth some effort to identify these risks, and reduce them if possible. Backup locations beyond Earth can be a last resort if such efforts fail, but most efforts should likely be directed at prevention rather than recovery.
==='''8.1 - Using Space to Solve Earth's Problems'''===
 
 There are abundant energy and material resources in space. If the cost of using them can be brought low enough, then that becomes preferable to, for example, putting more solar panels in climates unsuited to them, or digging ever deeper underground to find high quality ores.
 There is seven times more solar energy available in space near the Earth than the average on the ground. Atmospheric absorption, night, and weather account for the difference. The equipment to collect that energy is also about seven times lighter because it doesn't need to handle gravity and weather. So the energy to equipment mass ratio is roughly 50 times higher.
 There is also a wide variety of accessible materials in space, starting with the Moon's surface and nearby asteroids. These have been "pre-mined" in the sense that impacts have left them broken up and loose. Extracting them doesn't need heavy equipment, so the tons mined per ton of equipment is high. The combination of high energy and low equipment could allow rapid bootstrapping of space industry. The products can then help solve the problems and risks we noted above.
:'''Lowering Space Operations Cost'''
 Reaching and working in space has been very expensive, especially beyond the lowest Earth orbits. But that is an engineering problem, not one set by basic physics. For example, wholesale potatoes are on the order of $300/ton, and the wholesale electrical energy to put those potatoes in Earth orbit (8.7 MWh) is on the order of $550, less than twice as much. Sending even cheap bulk commodities to space would be affordable if done with high efficiency. Current launch costs are quoted at $1.52 million/ton or more (Falcon Heavy, 2022), 2750 times as much. This shows how much room there is for improvement.
 There are a number of ways this cost can be reduced. Reaching space today requires a good deal of equipment on Earth, like rocket factories, the rockets themselves, and launch sites for them. Self-improving automated production can lower the costs of these. As with other industries, you can begin with a starter set, and grow it until you have mature factories that produce the space hardware you need.
 A large amount of rocket and satellite hardware is discarded after use. This is a major contributor to high costs. Improved designs can allow reuse and repair. Conventional rockets are also inefficient. They require about 40 times the payload mass in fuel (for '''[https://en.wikipedia.org/wiki/Rocket_propellant#Current_cryogenic_types LOX/RP-1]''') containing 387 MJ/kg of fuel energy. The payload ends up with 32 MJ/kg of kinetic and potential energy, so the fuel efficiency is only 8.3%. Alternate launch methods can dramatically improve on this value, but there has to be enough traffic to space to justify their development.
 Advanced production methods in space, using materials and energy already there, can ultimately reduce mass launched from Earth by 98-99%. The transportation component of operating in space can then be reduced by a similar ratio. If in-space production costs are less than the launch savings, then overall costs go down.
 More efficient space technologies, like electric propulsion and closed life support, further reduce the mass from Earth needed to operate. The closer we can source supplies to the desired destination, the less effort is needed to move them there. So a Lunar or Mars base would ideally get most of what it needs locally, or from not too far away, and only get from Earth what can't be found or made otherwise. The combination of all these methods would get much closer to "potato cost".
:'''Space Development Process'''
 Our approach would follow the same general path in space as it does on Earth. In particular the methods used for difficult and extreme locations on Earth are relevant, although the details will differ. Space is nearly undeveloped and barely populated. So early tasks include delivering equipment to supply energy and gather raw materials. A core set of processing equipment would be used to turn raw materials into basic supplies like propellants, and production inventory like metal stock.
 Other equipment takes these products, plus some amount of imported items, and fabricates parts for more production equipment, plus finished items like habitats for people and food production. Metals for machinery and construction are likely the majority of first generation production, since that is the foundation of industry on Earth. Second and later generation equipment can then produce other materials and products in an expanding sequence.
 In the early stages there is less equipment available at a given location. So a larger percentage of parts and materials has to be imported from previous places, or from Earth. As more equipment accumulates, a higher percentage can be produced locally. Once a given location has matured enough, it can start to make items for new starter sets. These can be used in the same region, such as other parts of the Moon, or sent off to start developing new regions.
 Once a location can export a surplus of locally made items, they can be traded for those it can't make, or needed materials that are locally rare. Such trade would be based on '''[https://en.wikipedia.org/wiki/Comparative_advantage Comparative Advantage]''' like it is on Earth. By export and trade a location can become economically self-supporting, and not a cost burden. This is in contrast to a station or base that can't make things locally, which has to be supplied from elsewhere at a continuing cost.
 Self-supporting locations can produce an expanding wave of civilization and life as far as people want to carry them - throughout the Solar System, and in the long term, beyond it.
:'''General Space Environment Features'''
 Orbital locations in Phase 4 begin at 200 km altitude above the Earth's surface, where atmospheric density is low enough for stable orbits. They extend beyond that to the limits of stable orbits bound by gravity to Earth, then to interplanetary orbits at all distances from the Sun. The planetary system locations of Phase 5 are embedded within the larger interplanetary region, and move with the major bodies and the gravity fields they produce.
 The environment conditions, raw materials, and available energy vary widely across the different regions. So we divide Phase 4 into six sub-phases by region, and Phase 5 into five sub-phases. We expect their development to start mostly in order by distance from Earth. Orbital locations include smaller bodies like asteroids found there, and planetary systems include an area of stable orbits around them and the smaller bodies tied to them by gravity.
 The environment parameters for Phases 4 and 5 are generally more difficult than extreme ones on Earth (Phase 3B). The added difficulty in many cases is incremental, not orders of magnitude steps, and not in all parameters. Proper design and operation can deal with most of these conditions, but some places are so extreme that current technology has no way to handle them. The general ranges are noted here. Some details for sub-phases and particular locations are noted below. Extensive and growing knowledge about them comes from the field of '''[https://en.wikipedia.org/wiki/Planetary_science Planetary Science]'''.
* '''Temperature''' - Distance from the Sun, and the percent field of view of the '''[https://en.wikipedia.org/wiki/Cosmic_background_radiation Cosmic Background]''', which is at near absolute zero temperature (2.7K) are the main determinants of local temperature. It can range anywhere from above 700K to below 50K (+425 to -225 C). Partly shadowed orbits, or night on a surface, can produce wide temperature swings. Reflection from the surface of a body, or underground surroundings, will modify the ambient temperature.
* '''Water Supply''' - Orbital locations don't have a weather system that delivers a renewable water supply like Earth. But some bodies have water in the form of hydrated minerals or ice. Liquid water layers may exist inside dwarf planets and moons, and water in general is abundant beyond the "frost line" around 3 AU, where temperatures are low enough for ice to be stable in a vacuum.
* '''Atmosphere Pressure''' - Vacuum is the normal condition in open space and on the surface of most bodies. Some of the larger dwarf planets and moons have non-zero pressures, and all the major planets except Mercury have significant to dominant atmospheres.
* '''Ground Pressure''' - This doesn't exist in open space, and is generally low even for larger asteroids, either because of low gravity or low surface strength. Ground pressure can become significant if you go deep enough into larger asteroids. It becomes very high inside large moons and major planets.
* '''Energy Supply''' - Varies from above 10 kW/m<sup>2</sup> in close solar orbits to below 1.5 W/m<sup>2</sup> beyond Neptune. Orbits with time in shadow lose a percentage of this. Surfaces in vacuum reduce solar energy by about 50% from nights, with variations from topography like mountains and craters. Atmospheres can further reduce solar energy.
: Other sources like wind, precipitation, and geothermal may be available on some bodies. Nuclear power is possible using fuel delivered from Earth or mined from places with radioactive elements like the Moon. Power can be transmitted over moderate distances using conductors and beams, or even simple reflectors.
* '''Gravity Level''' - Natural gravity ranges from zero in free orbits, to about 3% of Earth's on dwarf planets, and up to 2.4 times Earth on larger moons and major planets. Artificial gravity can be supplied by rotation where biology or industrial processes need it. Artificial gravity is only limited by structural materials and practical issues like arrival and departure.
* '''Radiation Dose''' - Most orbits and surface regions have high natural levels of radiation from galactic cosmic rays, solar particle events (flares), and '''[https://en.wikipedia.org/wiki/Van_Allen_radiation_belt Radiation Belts]''' like the ones around Earth. Devices like solar panels and electronics are generally less sensitive to radiation than living things, but can still be damaged or temporarily upset.
: Radiation can be lowered to safe levels using bulk mass as shielding, or possibly artificial methods like magnetic fields. Shielding mass in orbital locations can come from asteroids or imported from moons. On substantial bodies their mass provides partial natural shielding, and going underground and arranging local materials can provide the rest. Transport vehicles can use fuel, water, or other supplies as shielding. Large habitats may get enough shielding from their outer structure, equipment, and storage tanks.
* '''Ping Time''' - Round trip communication time varies greatly from milliseconds in low Earth orbits to hours or even days in the outer Solar System. Essentially all the communication time is due to speed of light delays. On Earth, fiber-optic cables transmit at about 2/3 the speed of light, and follow indirect paths from geography and a spherical planet.
* '''Travel Time''' - This also varies greatly according to orbit region. It can take a few hours to reach low Earth orbit or return from it to the ground, plus some travel time to other population on the Earth's surface. Travel to the outer Solar System using known propulsion systems will take a number of years or even decades.
* '''Stay Time''' - This is currently very short because there are no permanently inhabited locations in orbit. Astronaut crews typically stay about 6 months aboard the International Space Station. With the development of larger, more permanent locations, with artificial gravity, food supplies, etc. the stay times can increase to a number of years.
* '''Transport Energy''' - Much less than 5% of civilization is in space, so transport energy is measured from the Earth's surface to an orbital location. This is a minimum of 33 MJ/kg, set by the physics of reaching low Earth orbit. It is a lot higher using current rockets, because their operating efficiency is low. More distant orbital locations require additional energy to reach, and currently this reduces cargo mass dramatically, producing even higher transport energy/kg.
==='''8.2 - Phase 4A: Low Orbit Locations'''===
 
 Sections 8.2 to 8.7 cover sub-phases 4A to 4F. We limit the a amount of detail to keep the size of this report reasonable, and in some cases is limited by the current state of knowledge about the regions. Each region would be developed using the general approach in Section 8.1, with some methods adapted to local conditions. The start of each successive sub-phase is staggered in time, but a region does not have to be fully developed before starting on the next one. They would develop in parallel once started.
 We suggest some economic uses for these regions, how to reach them, and how to develop them. We don't know enough to say if these are the best or only uses for them, and we certainly don't know what ideas other people will come up with in the future. So consider this report as a starting point for others to improve upon.
:'''Low Orbit Features'''
 Earth orbits form a continuous range from 200 km, the minimum set by atmospheric drag, to the maximum set by Sun's gravity becoming dominant. We divide that range in half by the transport energy required to reach it, at 2700 km average altitude. Conditions are different enough between low and high orbits to get their own sub-phases. Orbits can be elliptical and constantly vary in altitude, so we use the average between the high and low points, which is called the '''[https://en.wikipedia.org/wiki/Semi-major_and_semi-minor_axes Semi-Major Axis]'''.
 Objects in low orbits are in the Earth's shadow about 22-40% of the time, reduceing available energy. The Earth fills a large part of the field of view, which affects thermal balances, and lighting when over the sunlit side. Orbit periods are 2.5 hours or less, so travel time from the Earth's surface is fairly short. Ping time by way of ground stations is under 20 ms, so not difficult. But low orbits have a limited view of the Earth's surface at one time. So multiple ground stations are needed, or communications are relayed by a higher satellite. This can add up to 500 ms to round-trip communications, which is a noticeable delay.
 The Earth's magnetic field traps particles into '''[https://en.wikipedia.org/wiki/Van_Allen_radiation_belt Radiation Belts]''' that begin at low orbits and extend past them to high orbits. Unprotected people and electronics can be damaged by the high radiation levels. So spacecraft have to be designed to withstand radiation, avoid these belts, cross them quickly, have sufficient shielding, or the belts depleted artificially.
 Material resources are relatively scarce in low orbit. They include the upper edge of the Earth's atmosphere, and debris from inactive satellites and rocket stages. The mass of particles in the radiation belts is very small. Other materials have to be imported from Earth or higher locations.
:'''Economic Uses'''
 We would like all regions in space to become economically self-supporting. Earth orbits already are, with 75% of total space activity being commercial. Low orbits are occupied by a large number of active satellites serving the people below. Current uses include Earth observation, such as weather, mapping, and agricultural monitoring. Many satellites are now used for communications relay between points on the surface. Government uses include research, such as the Space Station and Hubble Telescope, and national security.
 Future uses may include tourism, orbital assembly and maintenance, and payload transfer, and refueling for more distant destinations. Further development of low orbits would start with existing markets. It would expand to new ones as transportation costs are reduced and local industry built up. We discuss some options in this section, but it is an area with projects being worked on by many others.
 We don't expect large-scale production and habitats in low orbits, because more materials and energy are available higher up. We do expect low orbits to become transit points, because below the radiation belts is the nearest place to Earth that is reasonably safe and doesn't need constant propulsion to maintain position.
:'''Transport from Earth'''
 Low orbit has few available materials, so most items have to be imported. Rockets and space hardware have existed for decades, but they are still too expensive for many future uses. As noted in section 8.1, self-improving and automated production can help lower the cost of building and running aerospace factories and launch sites.
 Reusing rocket hardware can improve costs substantially, but conventional rockets have low energy efficiency. They are limited by the energy in chemical '''[https://en.wikipedia.org/wiki/Propellant Propellants]''' and the mass of the Earth, neither of which is changing. A shift to different launch technologies can can improve efficiency and cost. But there has to be enough traffic to justify the added R&D cost in the face of existing rocket systems. There are many possible launch technologies. See Part 2 of our volume on '''[https://en.wikibooks.org/wiki/Space_Transport_and_Engineering_Methods Space Systems Engineering]''' for an extensive list. We provide one example here to illustrate the possibilities.
[[File:AEDC_Range-G_Launcher_facility.jpg|thumb|800x599px|Figure 8.2-1 - AEDC Range-G Hypersonic Research Gun (on left, 20cm interior diameter of barrel).]]
 '''Hypersonic Guns''' - Hypervelocity gas guns have been used in research for decades (Figure 8.2-1). They are inexpensive to build compared to most aerospace hardware. This is because they don't have to fly, so can be made of heavy industrial parts, and '''[https://en.wikipedia.org/wiki/Light-gas_gun Light Gas Guns]''' are basically simple devices.
 A larger version of such a gun, on a mountain with the correct slope, can supply 50-70% of orbit velocity for bulk cargo which is not sensitive to high g-forces. These include fuel, water, structural parts, even frozen food. Outdoor barrels measured in km rather than meters lower g-forces and operating pressures. But they are still generally too high for delicate cargo and people. Those would use other kinds of transportation. Industrial factories grown from starter sets could be a low-cost source for the construction equipment to build on the mountain, the high pressure pipe, other parts for the gun, and an energy source to compress and heat the gas for launch.
 Muzzle velocities much higher than ~4 km/s (half of orbit speed) become increasingly less efficient. This is because of limits on expansion rate of the working gas, and increased drag and heating while climbing through the atmosphere. The remaining part of reaching orbit is supplied by an internal rocket engine on the projectile or by other methods. Because the rocket engine only supplies half or less of the velocity, it is many times smaller relative to cargo than conventional rockets.
 The fuel-to-payload energy efficiency is roughly two-thirds, much better than conventional rockets. The gun also uses energy, but it is relatively cheap to operate. It is stationary on the ground, uses inexpensive materials, and can be used many times. The projectiles are rugged and durable, and can also be used many times. Re-entry is much gentler than the initial launch. The operating cost per ton to orbit should therefore be lower than conventional rockets. A gun-type launcher could deliver a large portion of the mass to orbit. There is no requirement that everything going to space has to travel the same way, any more than it does here on Earth.
 '''Other Launch Methods''' - Hypervelocity guns are just one example. Other technologies with reasonable prospects include high-speed air-breathing engines for the early part of flight, and orbiting structures with suborbital landing platforms for the later part. Both are more efficient than chemical rockets in their respective velocity ranges. Unfortunately neither can easily serve the whole job of transport to orbit. A combination of systems, each operating where it works best, is likely the better option.
 High speed jet engines and orbital platforms would require substantial R&D, and are therefore not likely to be the first things built. Instead, lowering the cost of conventional rockets is the first step. It would then be supplemented with a low R&D system like a hypersonic gun. Once new markets are opened up by the lower costs, the more advanced technologies that need more R&D can then make economic sense.
:'''Mining and Production'''
 Low orbits are not ideal places to process raw materials. That requires a lot of energy, and sunlight is blocked a good percentage of the time. But there is enough energy to fabricate parts and assemble them to finished items. For example, spools of high strength fiber and metal wire are rugged enough to be launched by bulk systems. The fiber and wire can be wrapped and plasma-sprayed in layers around inflatable or collapsible forms, to build up large, lightweight structures. Large pressurized volumes built this way can then house other production and assembly equipment and people to work there.
 There are some material resources in low orbit that don't require a lot of processing. At altitudes of around 200 km it may be possible to "scoop mine" the upper atmosphere. A collection scoop funnels incoming air, which is very thin at this altitude, to a vacuum pump and compressor. A portion of the air is expelled by electric engines at much higher velocity than the incoming flow. This makes up for drag from the scoop. The remaining air is stored in tanks.
 When the tanks are full, the mining ship climbs higher and unloads to storage tanks at a depot. The reason to mine like this, rather than launching gases directly from Earth, is the solar arrays that power the mining ship can produce 1000 times the energy needed to put themselves in orbit over their operating life. As long as the gas mining can be done with reasonable efficiency, launching solar arrays rather than tanks of gases results in much more usable product in the end.
 A steady supply of air (or nitrogen and oxygen if separated) obviously can be used to support people in orbit. It can also fuel tugs that collect dead satellites and debris from the Earth's "debris belt". This both reduces the hazard they create, and supplies useful resources. The collected materials can be scavenged for usable parts or recycled into new products. Dead satellites and empty rocket stages are made of aerospace materials, so they should not need a lot of processing to reuse.
 Mining the debris is only feasible with a cheap source of propellant and efficient electric engines. The pieces are in random orbits, and would consume too much propellant to gather otherwise. Air plus debris mining can provide enough materials to support some production in low orbit. The larger sources available from the Moon and asteroids, and the full-time solar energy in higher orbits, leads to the majority of production being done elsewhere. It can be efficiently delivered "downhill" using gentle '''[https://en.wikipedia.org/wiki/Aerobraking Aerobraking]'''. Low orbit mining and production then ends up supporting local uses, and this region functions as a transfer point between the ground and elsewhere.
==='''8.3 - Phase 4B: High Orbit Locations'''===
 
:'''High Orbit Features'''
 We define high orbits as extending from 2700 km average altitude to the limit of the Earth's dominant gravitational influence, or '''[https://en.wikipedia.org/wiki/Hill_sphere Hill Sphere]'''. For Earth this is about 1.5 million km, but towards the outer edges orbits become less stable. This is a large range of distances, but it only represents the upper 25% of energy between the Earth's surface and escape. That's because gravity is an inverse square force and weakens rapidly as you increase distance.
 The Moon is the most prominent feature in high orbit. It has its own area of dominant gravity, with a radius of about 60,000 km, and reasonably stable orbits with semi-major axes to about 35,000 km. Additional energy is needed to descend through the Moon's gravity field to low orbits or the surface. Conditions are also different enough near and on the Moon that we assign the region within 35,000 km to Phase 5A - Lunar Locations.
 High orbits are in sunlight 85-100% of the time, reaching the highest values when farther from the Earth and Moon. Temperature is determined mostly by the Sun and the cold Cosmic Background, but at lower altitudes the Earth contributes a significant amount of reflected light and infrared heat. Orbit periods range from 2.5 hours to 7 months, so travel times by the most efficient routes can be long. Direct paths can be much faster, 12 days or less, at the expense of additional energy.
 Ping time varies from as little as 25 ms, which is not difficult, up to 10 seconds, which has a large impact on voice, real-time control, and electronic data. The upper part of the Earth's radiation belts, solar, and cosmic radiation create high to dangerous levels for people and equipment. Energy resources are abundant in this region, but material resources are low in their natural state. The Moon and Near Earth Objects can supply materials with fairly low transport energies.
:'''Economic Uses'''
 One orbit in this region, geosynchronous, at 35,000 km altitude, is already heavily used. This orbit has a period of 24 hours, which matches the Earth's rotation. So satellites appear to stay above a fixed ground location, and ground antennas can be stationary rather than having to track satellite motion. Synchronous orbit is in the outer fringe of the radiation belts.
 Future production and human habitation would likely start higher up. One set of such locations are near the Earth-Moon L4 and L5 '''[https://en.wikipedia.org/wiki/Lagrange_point Lagrange Points]'''. These are stable regions, but not singular points. The Sun's gravity and the Moon's orbit not being circular or in the same plane as the Earth and Sun cause some motion around the points.
 Delivery, refueling, and maintenance of high orbit satellites from Earth are current and near-term activities for this region. Future activity can include supplying fuel and other supplies from space sources back to low orbit and to early interplanetary locations. These and other possible future activities depend on bringing costs down to affordable levels. This would happen incrementally as self-improving production for early markets bootstraps to larger levels.
 There are some civilization-level problems that high orbit activity can help with. If climate change solutions on Earth are not enough, orbiting sun filters can be used. They let wavelengths used by plants through, but block other parts of the solar spectrum. This would help cool the planet. Large solar system objects that pose a risk to Earth could be diverted or put to use instead. This requires finding them far enough in advance to change their orbit. An active civilization and biosphere off-planet could restore Earth if catastrophes happen despite our best efforts.
 The solar energy flowing through this region is nearly 500 million times what civilization uses today. The Moon and nearby asteroids can supply 250 million years of raw materials at Earth's current mining rate without recycling. With abundant energy and recycling a small fraction of these resources can make civilization sustainable for a very long time.
:'''Transport from Other Orbits'''
 Excluding the Moon, the high orbit region is nearly devoid of raw materials. So they must be imported from elsewhere. Current transport from Earth uses a rocket to reach orbit, then more chemical or electric propulsion to reach higher orbits. Electric propulsion is about ten times more fuel-efficient than chemical rockets, and is being used more in recent years.
 Electric engines need large amounts of power to operate, but efficient and lightweight solar panels have been developed in the last few decades (see '''[https://www.nrel.gov/pv/cell-efficiency.html NREL Efficiency Chart]'''). The engines are low thrust, which would expose people and some other items to too much radiation while crossing the Van Allen belts. So some early transport will use less efficient but faster rockets. Once propellants and bulk mass for shielding are available from space sources, the penalty for less efficient transport can be reduced.
 Bulk materials mined from NEOs (Section 2.1) are not time- or radiation-sensitive. They can be transported entirely by electric engines on tugs that make multiple trips. Since part of the product from these objects is more fuel for the tugs, the transport becomes self-sustaining once started. A tug can return about 750 times its hardware mass over a 15 year working life, while consuming about 17 times its mass in propellant over the same period. Tugs can also efficiently deliver hardware and finished products to other orbits as needed.
 The Moon is small enough that bulk materials can be thrown directly into orbit by electric catapults. Assuming 50% efficiency and 50% duty cycle from lunar night, a solar panel can power throwing 1000 times its own mass per year for a 15 year operating life. If the catapult is not too heavy relative to the total mass it can throw, the overall mass return ratio is high. From low Lunar orbit, electric tugs take over and deliver the materials for processing. There are about five major "ore types" of different compositions on the Moon and NEOs: highlands, maria, carbonaceous, stony, and metallic. Using all of them would supply the widest range of raw materials to make the widest range of products.
:'''High Orbit Production'''
 Energy is needed to convert raw materials into finished products. High orbits have abundant '''[https://en.wikipedia.org/wiki/Solar_constant Solar Energy]''', up to 11,930 kWh/m<sup>2</sup>/year. It can be converted to electricity by solar panels or used directly for heating using concentrating reflectors. Modern space solar panels and reflectors are very light weight relative to their power output, since they don't have to withstand gravity or weather. Excess heat can be disposed of by radiators or natural '''[https://en.wikipedia.org/wiki/Radiant_exitance Emittance]'''. Low temperatures can be reached with '''[https://en.wikipedia.org/wiki/Space_sunshade Thermal Shades]''' to block the Sun and other heat sources, and active refrigeration if needed.
 A set of solar panels can supply enough power to start production, since electric power has many uses. Early processing, fabrication, and assembly equipment would come from Earth or low orbit. The first set of products are simple items to be used directly, such as shielding mass, fuel, and basic construction materials. The early production equipment would be supplemented over time by items made in orbit. Over time high orbit industry would transition from importing everything, to making items locally, then exporting products to other destinations.
 Given sources of raw materials and energy, the simplest product of all is radiation shielding for people and equipment. This only requires crushing and sorting, then packing into containers around areas that need protection. Shielding also acts as thermal insulation and impact protection. Shielded modules allow extended crew stays in high orbit. Crews can operate production equipment and perform economic tasks for others, like satellite maintenance and refueling. To some extent the crew can be helped by remote control from Earth.
 Next in difficulty, but not necessarily in priority, are water and carbon compounds, extracted from '''[https://en.wikipedia.org/wiki/C-type_asteroid Carbonaceous-Type Asteroid]''' material. This requires 200-300 C temperatures, which reflectors can supply, and a container and condenser to capture the vapors. Water and carbon can be chemically reformed to oxygen and hydrocarbons, which are common high-thrust rocket propellants. This is useful when transporting people through the radiation belts or for landing on the Moon. They can also be used in electric engines for higher efficiency at lower thrust. Water, carbon compounds, air mined from low orbit, and possibly rock for soil can supply greenhouse modules, so that crews can produce their own food and recycle life support supplies.
 Metallic or '''[https://en.wikipedia.org/wiki/M-type_asteroid M-Type Asteroids]''' are thought to be the source '''[https://en.wikipedia.org/wiki/Iron_meteorite Iron Meteorites]''' found on Earth and Mars. They make up about 5% of known asteroids, with the metal portion being an iron-nickel alloy. A high temperature furnace can melt the alloy, a small amount of carbon added to make a steel alloy, and then cast into basic shapes.
 Steel makes up about 90% of all metal used on Earth. Being able to produce it from space sources would allow a much higher percentage of self-production in space. Subtractive and additive '''[https://en.wikipedia.org/wiki/Machine_tool Machine Tools]''' are used to turn basic metal shapes into finished parts. Those can be assembled, along with some imported items, into new machines, including more machine tools. New machines and constructed metal items can then work with other materials.
 Other space-made products can include '''[https://en.wikipedia.org/wiki/Basalt_fiber Basalt Fiber]''' made from lunar basalts, and '''[https://en.wikipedia.org/wiki/Carbon_fibers Carbon Fibers]''' from asteroid carbon compounds. These are are very high strength-to-weight. Fiber-reinforced metal structures are strong and relatively light weight. They would be useful for all kinds of construction.
 '''[https://en.wikipedia.org/wiki/Vacuum_deposition Vacuum Deposition]''' is relatively easy to do in high orbit since vacuum is the natural state of that region. Products can include lightweight reflector sheets, and parts for radiator panels. These can be combined with high-concentration solar cells from Earth to supply power with less mass than complete panels. '''[https://en.wikipedia.org/wiki/Refractory Refractories]''' are a class of materials that can withstand high temperatures. Some were formed in high-temperature environments in space, and others can be made artificially. They are used in all kinds of industrial processes such as furnaces and cooling systems for thermal processing of materials.
 In the long term, in-space production can supply up to 98-99% of the mass for space projects, greatly reducing what needs to come from Earth. The remaining 1-2% includes materials too rare in space to usefully mine, and products too hard to make relative to importing from Earth. Examples are electronics and drugs, which are already mass produced and high value for their weight. Importing them is easier than trying to make them.
:'''Living in High Orbit'''
 After science and and supporting existing satellites, the first people to spend much time in high orbits would be there to build up industry. But ultimately large, comfortable space habitats can be built as permanent living space, like towns and cities on Earth. Like the ones on Earth, they don't have to be built all at once. The first ones can be small, and attached to industrial production facilities.
 Larger residential habitats can also start small, but be designed to grow over time. Growth can be linear or in layers, like an onion. Linear growth can start with modules attached in a ring, with solar panels attached to each. The ring can be spun for artificial gravity. Additional rings can be stacked with the first one, with a ring of reflectors to direct sunlight to all the panels.
 Layered growth adds new pressure shells over compartments outside the previous ones. The outer shells are in vacuum, and provide radiation, meteor impact, and thermal shielding. Inwards of that are pressurized areas for storage and mechanical equipment. Then comes living quarters and a central open space. The entire habitat rotates for artificial gravity. As new layers are added, items are moved outwards to fill the larger space. Compared to building a large habitat all at once, this spreads the construction cost over time, and the habitat is only expanded when extra space is needed.
==='''8.4 - Phase 4C: Inner Interplanetary Locations'''===
 
:'''Inner Interplanetary Features'''
 These are orbits detached from the Earth's dominant gravity and go around the Sun instead, though they may pass close to the Earth at times. They range from as close as equipment can function to the Sun to 1.8 AU. This is just beyond Mars' greatest distance from the Sun (1.666 AU) and where the Main Asteroid Belt starts. It excludes Mercury, Venus, Earth, and Mars, and orbits around them.
 Solar power is available 100% of the time in these orbits, but the intensity varies from 31% to many times that near Earth, depending on Solar distance. Exposed temperature correspondingly varies from 244K (-29C) to very hot for dark objects, and less for bright or reflective ones. Travel time from Earth can range from months to years depending on orbit and propulsion method, and whether gravity assists from the planets are used. These save fuel, but usually require extra time.
 Solar and cosmic radiation are a moderately high background, with occasional flares/solar particle events that are much more intense, up to lethal human levels without shielding. Ping time ranges from a few seconds for orbits crossing near Earth, to over 45 minutes at 1.8 AU on the far side of the Sun, by way of a relay satellite. The Sun interrupts direct communication to the opposite side.
 As noted in section 2.1, there are nearly 32,000 known NEOs as of April 2023, and the number is currently increasing by 10% a year. There are another 1500 which don't come closer than 1.3 AU to the Sun and orbit within 1.8 AU on average. The largest among both sets, '''[https://en.wikipedia.org/wiki/1036_Ganymed 1036 Ganymed]''' isn't particularly easy to reach, but has about 100 times the mass of all the rock ever mined on Earth. So total material resources in this region is large.
 Asteroid orbits vary in size, are typically not circular, and somewhat tilted with respect to Earth's, so the energy required to reach a particular one varies. Timing also matters, since everything moves at different speeds in solar orbits. Efficient travel depends on a vehicle and the target arriving at the same place at the same time. The composition of asteroids vary across about a dozen spectral classes, indicating different chemical compositions.
 There are not many active comets in this region because the Sun's heat evaporates their ices in a short time. About 25 '''[https://en.wikipedia.org/wiki/List_of_minor_planets_and_comets_visited_by_spacecraft Minor Planets and Comets]''' have been visited by spacecraft so far. Most of our knowledge is from telescopes and examining meteorites that have fallen to Earth, and sometimes radar if they come close to us.
:'''Economic Uses'''
 There are only a few spacecraft currently in this region. They are mostly scientific probes in transit to other places, or stationed at the Earth-Sun Lagrange points 1 and 2 (ESL-1 and ESL-2). Future use is likely to start with asteroid mining and delivery to Earth orbit with electric tugs. About 75% of discovered asteroids in this region are more than 30 meters in size. This is due to limits of current telescopes rather than actual numbers, and may change with time. 30 meters implies a mass of 20-100 thousand tons depending on composition. This is too heavy to move whole with near-term propulsion. A method that should work with all sizes is scraping loose material or grabbing boulders from asteroid surfaces.
 Prior to mining, prospecting missions should visit multiple candidates for geologic mapping and sampling. Mining would start with asteroids that are easy to reach from Earth orbit, and return bulk ore there to be processed. As Earth orbits become more developed, they can start to send production and habitat equipment to this region in addition to mining. Since raw materials and full-time solar energy are available, this can grow in time to full size factories and produce habitats, vehicles, and whatever else is needed locally.
:'''Inner Interplanetary Transport'''
 The early transport in this region would be mainly slow but efficient electric tugs. They can haul large loads of rock relative to their mass, up to 1000 tons for a 10 ton vehicle and 23 tons of propellant. This will vary with the orbit destination and velocity changes needed. Smaller cargo loads can be moved faster with the same propulsion.
 '''[https://en.wikipedia.org/wiki/Gravity_assist Gravity Assists]''' can be used if the Moon and inner planets are in the right positions. Chemical rockets would be used when fast velocity changes are needed. Solar sails may be effective in moving things even more slowly but with no propellant use. This depends on large lightweight reflectors delivered to or made in orbit.
 Over time, a network of "transit habitats" can be built up. These are stationed in repeating orbits between planets and particular destinations. They would be larger, safer, and more comfortable than individual passenger vehicles. They can self-supply from nearby asteroids. This reduces having to send life support equipment and supplies each time for the relatively long trips in the region.
 Rotating platforms called '''[https://en.wikipedia.org/wiki/Skyhook_(structure) Skyhooks]''' can be built to provide both comfortable gravity and fast velocity changes. The platform mass stores momentum from very efficient propulsion that can be exchanged with payloads arriving and departing. The platform needs to be relatively heavy relative to each payload, so it doesn't change its own orbit much in use. Natural asteroids, production "slag" (leftover material not used in products), and the platform's own structure and equipment can serve this purpose. If traffic is balanced in direction, the net orbit change will be minimal.
 Skyhooks can serve as a space equivalent to airports - mainly used to get from one place to another. Like airports, they need enough traffic to justify their construction, and can be developed and upgraded over time. Building them is easier if high strength materials can be produced locally in space.
:'''Inner Interplanetary Production'''
 Global primary energy consumption on Earth was 18 TeraWatts in 2021. This includes mining, processing, and manufacturing about 2 million kg/s of materials. So the energy intensity of civilization is 9 MJ/kg on average. We will double this to allow for recycling of materials in space, and add 8 km/s of orbit velocity change, requiring 300 MJ/kg of electric tug power. That covers a reasonable range of interplanetary orbits.
 Transportation rather than production is then the dominant energy use in this region for new materials that need delivery. Modern space solar arrays typically product about 100 W/kg near Earth, and would take 36.8 days to produces the required 318 MJ. With a useful life of 20 years, their total energy output is 200 times that needed to transport their own mass in raw materials and all other energy needed to make replacement panels. Concentrating reflector and nuclear power sources are not yet developed enough for space to do calculate energy return ratios. They may turn out better or worse than solar panels, but as long as we have one known energy source with a high return ratio, we can base space industry on it.
 The same process of bootstrapping production in Earth orbits can be used in interplanetary space. This starts with mining for export, then simple products made locally, and gradually growing to make more complex ones. As distance from Earth increases, fewer raw materials would tend to from the Moon, and more from nearby asteroids. These asteroids are of different types, which provides a reasonable variety of materials to work with.
 If we restrict ourselves to within 20 degrees of the '''[https://en.wikipedia.org/wiki/Ecliptic Ecliptic]''', to maintain access to the planets and keep velocity changes lower, we have access to 1/3 of the Sun's total energy, or 1.3 x 10^26 Watts. This is 7 trillion times our current energy use, a number so large it is hard to imagine it could not sustain civilization.
:'''Living Beyond Earth Orbit'''
 Once methods of living in orbits around Earth are developed in the previous phases, doing so in solar orbits beyond the Earth-Moon region can use the same basic technologies. The main adjustments would be for available solar energy and temperature with distance from the Sun, and the kinds of materials found relatively nearby in velocity terms. In space, velocity changes take work, while coasting to a destination merely takes time.
 It isn't yet clear if a "hunter-gatherer" or "sedentary" lifestyle would be more effective. The first means moving equipment to new asteroid locations as needed, while in the second the it stays in a particular orbit, and materials are brought to it. Since everything is in relative motion around the Sun, opportunities will change with time. So choosing a particularly useful asteroid as a home location may be a good strategy.
==='''8.5 - Phase 4D: Mid-Interplanetary Locations'''===
 
 Living and working in the next region out from the Sun is a smooth continuation of the previous phase, but is different in having lower levels of solar energy and much larger amounts of raw materials.
:'''Mid-Interplanetary Features'''
[[File:InnerSolarSystem-en.png|thumb|600x600px|Figure 8.5-1 - Main Asteroid Belt and Jupiter Trojan region.]]
 This region includes orbits from 1.8 to 6.0 AU in semi-major axes (Figure 8.5-1). As of 2023 this includes dwarf planet '''[https://en.wikipedia.org/wiki/Ceres_(dwarf_planet) Ceres]''', 1.18 million other Main Belt asteroids, over 5600 '''[https://en.wikipedia.org/wiki/Hilda_asteroid Hildas]''', which are in 3:2 resonance with Jupiter, and over 12,500 '''[https://en.wikipedia.org/wiki/Jupiter_trojan Jupiter Trojans]''' that occupy the Lagrange regions ahead of and behind the planet. It does not include Jupiter itself and the region within 20 million km of the planet (Section 9.4).
 There are around 450 known comets in the region. The '''[https://en.wikipedia.org/wiki/Frost_line_(astrophysics) Frost Line]''' for water is in this region at 2.7-3.2 AU. So this is where many comets become active (give off gas and dust), making them easier to find. Hydrogen and oxygen are the 1st and 3rd most common elements, and helium (2nd) doesn't make compounds. So water is the most common compound of two elements. Objects beyond the frost line tend to have have large amounts of it.
 Solar power is available 100% of the time except shadowed areas on and around objects. Intensity varies from 31 to 2.78% of that near Earth. Temperature varies from 244 to 217K (-29 to -56C) for black objects, and less for lighter colored ones. Travel time from Earth is months to years on minimum energy transits, with high to lethal radiation levels for unprotected people. Ping time varies from 13 to 120 minutes, including a relay to avoid a direct path through the Sun.
 The vast and growing number of known objects in the region have a total mass of about 3 billion Gigatons, which far exceeds the Earth's total mining output of about 60 Gigatons/year. About half the total mass is in the four '''[https://en.wikipedia.org/wiki/List_of_exceptional_asteroids Largest Asteroids]''': 1 Ceres, 4 Vesta, 2 Pallas, and 10 Hygeia. Composition varies considerably between asteroids due to differences in their formation and history. Velocity to reach orbit from the largest body, Ceres, is only 270 meters/second, or 860 times less kinetic energy than from Earth. So all these objects are easy to access once you are near them. The main energy cost is in adjusting your orbit around the Sun.
:'''Economic Uses'''
 This region has very few of spacecraft at present, so most uses are in the future. Abundant raw materials of diverse composition, and adequate amounts of solar energy when concentrated, will enable mining and transport to earlier locations as early activities. Previous locations have higher solar intensity for production and habitation. When it makes sense to do so, seed factories and other advanced technologies can help bootstrap a full range of local industry, and eventually large scale habitation. There is enough material and energy in this region to support a full civilization.
:'''Mid-Interplanetary Transport'''
 The same transport methods can be used in this region as for the inner interplanetary region. The main difference is adding reflectors to solar panels to make up for the lower solar intensity. Electric catapults and skyhooks are somewhat more efficient for injecting bulk cargo to transfer orbits, because they do point acceleration rather than spiral orbits. If a large asteroid absorbs the reaction force, they also don't need propellant. Gravity assists from the inner planets and Jupiter can also increase efficiency.
:'''Mid-Interplanetary Production'''
 The inner parts of this region have enough sunlight for solar panels to produce power directly. In the outer regions, solar panels benefit from reflectors to increase the light intensity. Concentrating reflectors can produce higher temperatures at all distances, either for industrial processes or habitats. Increasing amounts of reflectors are needed as you get farther from the Sun, but they are inherently lightweight in a zero gravity environment with no weather. Note that the total amount of solar energy available in this region is the same as for the Inner Interplanetary region. It has simply traveled farther and is more spread out. The difference is access to larger amounts of raw materials.
 Asteroids are covered in a mixture of rocks and dust of varying sizes. This is the result of repeated impacts over their life and gravitational attraction. In fact, some asteroids are so low in density that they must be "gravel piles", with no solid central body. Since most asteroids are small, the rocks and dust are easily disturbed and can become a hazard to mining and production operations. So material has to be removed carefully without too much disturbance. Alternately the mining area or the whole asteroid can be covered to contain loose material.
 More distant asteroids and comets contain water and other volatile compounds. These can be extracted separately by heating. Bulk or separated products are then moved by tugs to factories for later production steps. For larger operations, a shell can surround the whole asteroid, keeping gas and dust contained. Processing equipment can then be attached to the outside of the shell, and materials delivered continuously until the asteroid is consumed. The mining and production unit can then move to another target, or the target moved to the unit, whichever is lighter.
==='''8.6 - Phase 4E: Outer Interplanetary Locations'''===
 
 This region is again a continuation of the previous one, with even less solar energy and about 40 times more available materials.
:'''Outer Interplanetary Features'''
 Outer interplanetary orbits range from 6 to 60 AU in semi-major axis. The areas close to Saturn, Uranus, and Neptune are excluded. They are accounted for in Phase 5E (Section 9.5}. As of 2023 there are over 500 known '''[https://en.wikipedia.org/wiki/Centaur_(small_Solar_System_body) Centaur]''' objects. These have orbits among the four giant planets, whose gravity makes them unstable over a few million years. There are also thousands of known '''[https://en.wikipedia.org/wiki/Trans-Neptunian_object Trans-Neptune Objects]''' with orbits beyond that planet, making a total of about 3800 in this region. Some, like Pluto and Eris, are large enough to be considered '''[https://en.wikipedia.org/wiki/Dwarf_planet Dwarf Planets]'''. The remainder are in the range of 15 to 850 km, with the lower end set by our current telescopes' ability to find them. There are undoubtedly smaller ones that are undiscovered.
 Available solar power is low, from 2.78% to 0.0278% of near-Earth values. This requires large reflectors to increase intensity, nuclear fission or fusion (if developed), or beamed energy from closer to the Sun. Ambient temperatures are extremely cold, from 160 to 50K for black objects, and lower for lighter ones. Travel time from Earth is typically many years, with high to occasionally lethal radiation levels for unprotected people. Ping time is 1.4 to 17 hours.
 The number of known objects is much smaller than the Mid-Interplanetary region, but their mass is roughly 40 times larger - about 2% of Earth or nearly double the Moon. With increasing distance from the Sun, gases and ices with lower boiling points condensed from the original Solar Nebula. So there is more water, ammonia, nitrogen and other frozen materials, along with rocks and metals. The distinction between asteroid and frozen comet becomes fuzzy, so we call all of them 'objects' and the smaller ones 'minor planets'.
:'''Outer Interplanetary Activities'''
 This region is likely too far to use with current technology. Activities beyond science and exploration are far enough in the future that technology is likely to change in unexpected directions. When other activities would start and what they will be is undertain, but we can speculate based on what we know today. The raw materials in the region are different than those closer to the Sun. So the first activities are likely to be mining materials scarce closer to the Sun, and bringing them to where there is more energy to process them.
 Due to weak sunlight in this region, nuclear propulsion and gravity assists from the larger bodies are likely to be major transport methods. The solar system has a limited amount of natural '''[https://en.wikipedia.org/wiki/Radionuclide Radionuclides]''' that can produce useful power levels. If '''[https://en.wikipedia.org/wiki/Fusion_power Fusion Power]''' is not developed enough, they can be made artificially near the Sun where abundant energy is available. If nuclear fusion is well developed, there is abundant hydrogen from which fusion fuels can be produced.
 As distance increases from the Sun, orbit velocities and required velocity changes decrease as the square root of. Solar flux decreases faster, as the inverse square of distance. So solar sails become less effective than for closer regions. Beamed energy from close to the Sun is a possibility. It requires large optics to focus the beam to a reasonable size at destinations in the region.
 We don't expect a lot of production here at first. Water and nitrogen are very useful and found in large amounts. Transport would be slow using minimum energy trajectories. If there is enough demand, a "pipeline" of bulk cargoes in transit could be set up, with vehicles at each end to set them on course and collect them at the end. The cargo can coast in between, saving on vehicle use. Once the pipeline is filled, then cargoes arrive on a regular schedule.
 If lightweight solar reflectors or fusion are developed enough, a full economy based on them may develop, with full production and habitation. We don't see a strong reason to live this far out rather than the warmer and brighter inner regions, but such reasons may develop.
==='''8.7 - Phase 4F: Distant Orbit Locations'''===
 
 The previous three phases are called 'interplanetary' because they are among or near the eight known major planets. This last region is beyond all of them so we call it 'distant'.
:'''Distant Orbit Features'''
 Distant orbits range from 60 AU in semi-major axis to the limits of the Sun's dominance at about 100,000 AU. As of 2023 there are about 1200 known asteroids and comets in the region. It includes about 650 '''[https://www.minorplanetcenter.net/iau/lists/t_centaurs.html Scattered Disk]''' and '''[https://www.minorplanetcenter.net/iau/lists/t_tnos.html Trans-Neptune]''' objects, and a similar number of
'''[https://en.wikipedia.org/wiki/List_of_long-period_comets Long Period]''' and '''[https://en.wikipedia.org/wiki/List_of_near-parabolic_comets Near Parabolic]''' comets.
 A few of these objects belong to much larger and more distant populations known as the '''[https://en.wikipedia.org/wiki/Hills_cloud Hills]''' and '''[https://en.wikipedia.org/wiki/Oort_cloud Oort Clouds]'''. For our purposes we define these as orbits with axes from 2000-10,000 AU and 10,000 to where passing stars, gas clouds, and galactic tides make orbits unstable. This is roughly 100,000 AU. The existence of comets whose orbits extend to these distances argues for the cloud's existence. Otherwise no active comets would be left after billions of years. Their total number and mass is only guessed at, but may be billions to trillions and multiples of the Earth's mass. There is some evidence to suspect a major planet is also in this region.
 Current telescopes are limited to finding objects within about 80 AU from the Sun. So only the ones that come within the 60-80 AU range at their closest ''and'' are currently at the near end of their orbits have been found to date. We expect to find many more objects in the region as telescopes improve. Active comets from distant orbits which come close to the Sun give us some information on composition from the gas and dust they emit.
 Solar energy is very weak in this region, below 0.0278% of that near Earth, and temperatures are extremely cold, from 50K down to near the cosmic background of 2.7K. Travel time with current propulsion technology is many years to centuries. Ping time ranges from 14 hours to 3 years.
:'''Distant Orbit Activities'''
 Our current information about objects in this region is poor. So any uses beyond science and exploration are deferred to the far future. When that time comes, though, there is a very large reserve of materials that can be put to use. One identified use is the Sun acting as a gravitational lens, with a focus around 800 AU from the Sun, in the Scattered Disk region. Placing telescopes directly opposite a star of interest would allow much more detailed observations than otherwise possible, because of the 2 million km optical diameter of the Sun as a lens.
 To keep transport times within reason, very high energy propulsion would be needed, such as nuclear fusion. Since the light elements needed for fusion are common in these outer regions, this could be self-fueling once set up. Unfortunately, fusion is not yet a viable technology. Transport that uses it remains speculative at present. Due to the low to nearly non-existent solar energy in this region, nuclear energy sources would likely be needed to even consider local production. Production must remain speculative at present.
=='''9.0 - Planetary System Locations'''==
 
 The planetary systems of Phase 5 are different in several ways from the orbital locations in Phase 4 and from each other. Specific designs are needed to handle the differences, so we identify separate sub-phases for each. First are their gravity fields, which require energy to travel through and create significant surface gravity. Second are their large sizes relative objects in the orbital regions, and third is the diversity of conditions found on and around the planets.
 Reasons to use planetary systems include access to the different raw materials available, relief of Earth's biosphere by moving industry off-planet, and some people's preference for natural environments. As with orbital locations, the start of each sub-phase is staggered from nearest to furthest, and is preceded by orbital transport that can reach them carrying useful amounts of equipment. So Phase 4 and 5 projects will overlap in time.
==='''9.1 - Phase 5A: Lunar Locations'''===
 
 Earth is one of the eight major planets in the Solar System. It is already occupied and developed, and we covered using our technical approach earlier in this report. We also covered most orbits around Earth in Sections 8.2 and 8.3. The exception was the '''[https://en.wikipedia.org/wiki/Moon Moon]''' and the area around it. We place it here among other planetary systems since lunar activities are more similar to those for smaller planets and the larger moons of the other planets.
:'''Lunar Features'''
 The Lunar region includes the Moon itself, and orbits with semi-major axes below 35,000 km . These are close enough to be relatively stable. Lunar orbits in general are somewhat unstable. The Moon has mass concentrations from past impacts that create an uneven gravity field (Figure 9.1-1). The Earth and Sun are also much more massive than the Moon, and have significant effects on objects orbiting it ([https://link.springer.com/article/10.1134/S0038094617070061 ''Gordienko, 2018'']).
 The Moon has the same average distance from the Sun as the Earth, so available solar energy and basic temperatures ranges are the same. Sunlight is partly blocked in lower Lunar orbits, and blocked about 50% of the time on the surface over a 29.5 day cycle. Surface gravity averages 1.62 m/s<sup>2</sup>, or 1/6th of Earth, with a total variation of 0.025 m/s<sup>2</sup> by location.
 Escape velocity from the Lunar surface is 2380 m/s, or 21% of Earth. So escape energy is only 4.5% of Earth's. Low orbit velocities are 1680 m/s or less, and 700 m/s more is needed to escape from them. Circular orbit velocity at the upper edge of the region is 375 m/s, and escape is an added 155 m/s. Surface area of the Moon is 37.93 million km^2 measured horizontally, or about one quarter of the Earth's land area. Sloped terrain increase the total exposed surface area.
[[File:Moon_gravity_acceleration_map_LGM2011.jpg|thumb|right|800x450px|Figure 9.1-1 - Lunar surface gravity map. Near side on left, far side on right.]]
 Earth is only 81.3 times the Moon's mass. So the center of mass of both averages 1/4 of the way down from the Earth's surface to it's center. Both move around this center every 27.3 days with respect to the stars. Since both also orbit the Sun, the Moon's orbit and day lengths are not the same.
 The Moon is tidally locked to Earth, and keeps approximately the same side facing us. It is not exact because the Moon's orbit is not circular, it has a slight residual pendulum motion, and we have different vantage points from the Earth's surface. So about 59% of its surface can be seen from Earth over time. The two hemispheres are called the "near" and "far" sides. There is no "dark" side, since both get sunlight during a lunar day.
 Orbits around the Moon vary from 108 minutes close to the surface, to 6.8 days for the largest ones in the region. Travel time from Earth is 3-4 days for direct transfer orbits. Electric propulsion is much more efficient, but also much slower. Without shielding, travel to and staying on and around the Moon can expose people to lethal radiation levels. This is from Earth's radiation belts, solar, and cosmic sources. Ping time from Earth to the Lunar region varies from 2.2 to 2.94 seconds, depending on where in the region, and the Moon's distance in it's orbit. This includes satellite relay time if communicating with areas that can't be seen directly from Earth.
 The Moon has a somewhat variable and reasonably well understood '''[https://en.wikipedia.org/wiki/Geology_of_the_Moon Geology]'''. This is known from a number of lander and orbital missions, some of which returned samples, and '''[https://en.wikipedia.org/wiki/Lunar_meteorite Lunar Meteorites]''' thrown to Earth by impacts. Broadly, the surface is oxide minerals with silicon, iron, calcium, aluminum, and magnesium, in order of abundance, and 3-4% other elements.
 The Moon is too small and warm to keep an atmosphere. With nothing to stop them, the surface has been heavily cratered and broken up by repeated impacts of all sizes. The result is a '''[https://en.wikipedia.org/wiki/Lunar_soil Regolith]''' or lunar soil that has been tossed around many times. It is a mix of the original crust and the remains of impacting objects. There is no weathering like on Earth, but the solar wind can charge dust particles which then move, and temperature cycles cause rocks to crack near the surface.
:'''Economic Uses'''
 The Lunar region is embedded in the High Orbit region, and reaching it from Earth is possible with current and near-term transport. Science and exploration activities are already in progress. Further development can start as soon as there are economic reasons for it. The first uses are likely to be local on the surface, and from the Moon's relative closeness to populated satellite orbits and low energy to reach these orbits. For example, some '''[https://en.wikipedia.org/wiki/Lunar_water Water]''' appears to be trapped in cold polar craters on the Moon. It has multiple uses, and could be delivered relatively efficiently to high and low Earth orbits.
 Regolith mining can supply enough materials for much larger projects on the Moon and nearby orbits. The loose surface layer averages 5 meters thick across the whole Moon. It can be collected without using heavy equipment and totals about 300,000 Gigatons, or 7,000 years of Earth's total stone and sand mining in 2020. Projects that use lunar (and asteroid) materials are not as limited by launch mass and cost from Earth, so they can use simpler and heavier designs. In the future, production that uses lots of energy, or have hazards and side effects, could be moved to space to reduce the burden on Earth's environment.
 Satellites that beam energy to Earth is one possibility. If this can be done economically, it might become the largest export market from orbit. Renewable energy on Earth is now relatively low cost, but it is variable and some places have poor conditions for using it. There is 10 times more solar energy in space than such places and it is more predictable. So it may prove useful, despite the extra cost of building in space.
:'''Lunar Transport'''
 Early landings on the Moon would not have the support of much infrastructure. They would use current high thrust chemical rockets to access the surface. At first, all propellants would come from Earth. Water from polar lunar craters can supply 83.5% of methane/oxygen propellant, and and also life support supplies, reducing the mass needed from Earth. Carbonaceous type asteroids contain up to 20% carbon compounds and water. These can be reformed chemically to CH<sub>4</sub> and O<sub>2</sub> and fully replace Earth supplies. How much would come from each source will depend on cost and availability.
 Over time, chemical propulsion can be replaced by more efficient methods. As mentioned in Section 8.3, an electric catapult can deliver 1000 times a solar array's mass per year from the surface to Lunar orbit. Electric propulsion can then move lunar and asteroid materials a common orbit for processing. High orbits around the Moon or Earth are preferred for their near-full time sunlight and a combined low velocity to reach. Both propellants and other products can be made with processing and manufacturing equipment in the same location.
 Lunar basalt and carbon from asteroids can be used to make high strength fibers. These can be used to build an efficient skyhook system in lunar orbit. Such a system makes sense if there is enough traffic to the Moon. If the tip velocity is equal to orbit velocity they cancel, and trips to the lunar surface would need very little fuel. A lander can be dropped off and picked up at low altitude. It would not be dropped directly on the surface because of the variable gravity field and heights of lunar mountains and crater walls.
 If the skyhook is in near-polar orbit, it can access any point on the surface every 15 days as the Moon rotates below it. Using other angles of the skyhook's rotation, and by climbing to different distances from the center, arrival and departure directions and speeds up to 1.41 times lunar escape are possible. Catching and releasing vehicles affects the skyhook's orbit. If traffic is balanced in direction and mass, and the skyhook is massive enough, it is a temporary change. If traffic is more in one direction than the other, the difference can be made up by electric propulsion at high efficiency.
 Low gravity is known to be harmful to people. If the skyhook radius is about 250 km, the tip acceleration will be about 1 g, which avoids this problem. A large supply of lunar materials can supply shielding. With these people can live comfortably and safely. They are close enough to the lunar surface to operate equipment by remote control in real time. Alternate solutions are using rotating habitats on the surface or limiting stay times.
:'''Lunar Production'''
 The advantages of using the Moon are relative closeness to high orbits, and low energy to move cargo. But there are few low boiling-point materials left on the Moon, because it formed in a molten state, suffered many high energy impacts and early tidal heating, and is too small to keep an atmosphere. A fully-developed space economy would need to supplement lunar materials with those from nearby asteroids and from Earth. Some materials are too rare to usefully mine in space, and some products are too hard or expensive to make there relative to delivery from Earth. So two-way trade can develop for lunar activities to support themselves.
 Early Lunar production can start with mining bulk regolith for radiation/thermal/impact protection, and polar ice for propellant and life support. These don't need a lot of complex equipment. More energy-intensive and complex processes like vacuum oxide reduction and '''[https://en.wikipedia.org/wiki/Carbothermic_reaction Carbothermic Reactions]''' can separate oxygen and various metals from the regolith. Seed factory equipment can be used to bootstrap making other products for local use and export. As better transport systems are installed in sequence, the cost of delivery elsewhere will decrease.
 Solar energy will likely be the dominant energy source for lunar production. Silicon for solar cells, aluminum for reflectors, and other metals for structures are widely available from the regolith to provide solar power. However some craters with water are permanently shadowed, the lunar night is two weeks long, and large solar plants are not very portable. So other energy sources may be useful.
 Some regions of the Lunar surface contain ~10 parts per million Uranium and Thorium. The ore has an energy content of about 800 MJ/kg (20 times that of coal on Earth). Helium-3 has been proposed as a fusion fuel to be mined from the Moon. Although the energy content of pure He-3 is 200 TJ/kg, the concentration is only 15 parts per billion or less, resulting in an ore content of only 3 MJ/kg. So fissionable elements are a better energy source on the Moon in terms of energy produced per ton of mined ore.
 Other energy sources for the Moon can include the rims of shadowed craters, where sunlight is highly available, microwave or laser beamed power across terrain or from orbit, and even fuel cells or batteries for portable power. Thermal energy storage is an option using the vast amount of rocks and dust as the storage medium, and the natural vacuum as insulation. The material is heated during the day by sunlight, and the heat used to generate power during the Lunar night.
:'''Living in Lunar Locations'''
 Low gravity is known to be harmful, so long-term habitats on the Lunar surface may require rotation to create artificial gravity. An example would be a large habitat dome for spaciousness, and a centrifuge built around the rim for living quarters. Residents would spend enough time in the centrifuge to maintain health, but could work and enjoy the low gravity the rest of the time.
 We have essentially no data on how much gravity is enough between zero and 1.0. We know the body deteriorates over time in zero gravity. So as a worst case, people would need to spend most of their time in a one gee environment of some type, but this subject needs more research. Another option is limiting permanent stay times on the surface. People would live mostly in orbit with artificial gravity and operate most equipment by remote control.
 The other requirements for people to live and work in the lunar region have mostly been solved by existing space stations, and using bulk materials for shielding. One exception is lunar dust, which is abrasive, toxic, and is everywhere on the surface. Various methods to deal with it have been proposed, but R&D is needed to figure out which work best.
==='''9.2 - Phase 5B: Mars Locations'''===
 
 '''[https://en.wikipedia.org/wiki/Mars Mars]''' is next among planetary locations in terms of velocity and time to reach, and the environment conditions there. It is a large step beyond the Moon, but Mars is within the inner interplanetary region (Section 8.4) that Earth also occupies. So we expect Martian activities to start after some level of development of the region in-between.
:'''Mars Features'''
 The Mars region includes the planet, two small moons, and reasonably stable orbits with semi-major axes up to 340,000 km (100 radii). Its orbit around the Sun is 9.3% eccentric, varying from 1.38 to 1.67 AU in distance. Solar flux varies with distance from 494 to 716 W/m<sup>2</sup>, or 36 to 52.5% of that near Earth. Surface gravity varies from 3.683 to 3.743 m/s<sup>2</sup>, a 1.6% range, with a reference value of 3.711 (3/8ths of Earth). Lower values are near the equator and atop tall mountains, while higher values are at lower altitudes in the north polar region and '''[https://en.wikipedia.org/wiki/Hellas_Planitia Hellas]''' basin.
 Ping time from Earth varies from 6 to 45 minutes, depending on relative orbital position and need for a relay satellite to avoid the Sun. Unprotected radiation levels range from high to lethal, but the Mars surface and its moons provide ample material for shielding.
 Escape velocity from the surface is 5,027 m/s, and is 502 m/s at the upper edge of the orbital region. Circular orbit velocities are 70.7% of escape. This ratio holds for orbits around any body. Escape energy is 20% that of Earth. Orbits around Mars vary from 100 minutes for low ones to 70 days at the edge of the region. Surface area of Mars is 144.8 million km<sup>2</sup>, or 97% of Earth's land area. Day length is 24h 40m, slightly longer than Earth, and the Martian year is 1.881 Earth years. Travel times vary according to the relative positions of Mars and Earth, and the transport method used. When aligned, minimum energy orbits average 7 months one way.
 The moons '''[https://en.wikipedia.org/wiki/Phobos_(moon) Phobos]''' and '''[https://en.wikipedia.org/wiki/Deimos_(moon) Deimos]''' have near-circular orbits of with 9,377 and 23,460 km radius. They have mean diameters of 22.5 and 12.4 km, but are irregular shapes. They have a combined mass of 12,800 Gigatons, or 290 years of Earth's rock and sand mining. This is a significant orbital resource. They are likely collected impact debris, so similar to Mars in composition.
[[File:Generalised_Geological_Map_of_Mars.jpg|thumb|700x1024px|Figure 9.2-1 - Generalized geologic map of Mars.]]
 The atmosphere is 96% CO2, a bit under 2% each Argon and Nitrogen, and an assortment of trace gases. Surface pressure varies from 30 Pascals at the top of Olympus Mons to 1155 Pascals in the Hellas basin. The high value is 1.14% of sea-level pressure on Earth. Pressure varies by 30% annually, as some of the CO2 freezes and evaporates at the poles. Surface temperatures vary from 120 to 293K (-153 to 20 C), depending on latitude and season. Typical day-night variation is 70K/C because the atmosphere does not have much thermal mass.
 Mars has quite a varied surface geology, as a result of internal melting and vulcanism, impacts, and much higher levels of water and atmospheric pressure earlier in it's history (Figure 9.2-1 from '''[http://pubs.usgs.gov/sim/3292/ USGS Map 3292, 2014]'''). There is significant amounts of water in the soil as hydrates, permafrost, and in thick dusty ice caps.
:'''Economic Uses'''
 Human activity in the region can begin with a scientific outpost. It would be an extension of existing robotic exploration, and Phase 4C activity among asteroids in the surrounding region (Section 8.4). The outpost and relay satellites are placed in orbit close enough to Mars for real-time remote control. Surface robots carry out science and sample collection at first, with some samples returned to the outpost for further analysis. Most outpost supplies can come from Mars' moons and nearby asteroids.
 Over time, other robots and equipment are delivered to the surface to start to preparing for people. Once enough supplies and basic production are in place, they can start to visit. This approach delays risking people on the surface until a supply chain and reliable two-way transportation is available.
 As more production capacity is built up on Mars and surrounding orbits, it can start to transition from science to prospecting for unique resources, building up local habitation, and a full economy. Since Mars has almost the same land area as Earth, there is plenty of room to do this. Building up activities in the Mars region would be a relatively small extension from previous regions. So it is not a large cost burden, but rather an investment in further growth.
:'''Mars Transport'''
 In Phases 4B and 4C (sections 8.3 and 8.4 above), electric tugs were used to move asteroid materials back to Earth/Moon orbits for processing. To expand towards Mars, the same type of tugs move materials from Near Earth or Near Mars orbits to specific '''[https://en.wikipedia.org/wiki/Mars_cycler Mars Cycler]''' orbits. These orbits allow repeat flybys of Earth and Mars using gravity assists. Given the many thousands of asteroids in the interplanetary region, some of them have low velocity to and from a cycler orbit.
 Other tugs deliver habitat modules and initial processing equipment from near Earth to the same orbit. The raw asteroid materials are distributed around the habitat for radiation shielding, and used as a counterweight for artificial gravity. At the next opportunity a crew meets up with the new "Mars Transfer Station", and begins to process the raw materials into fuel, air, water, metals, etc. They also establish a greenhouse to produce food. When raw materials run low, a tug is sent to another nearby asteroid to get more.
 Whenever the Transfer Station is near Earth, new crew, equipment, and supplies can be delivered. Crew aboard the transfer station are safe from radiation hazards, have gravity to maintain health, and can eventually produce most of what they need themselves. The Station can be used multiple times to bring new crews to Mars, saving mass over carrying a life support system and supplies for every trip. Cargo besides people can travel to the Mars region directly with tugs.
 When the transfer station is built up enough, a set of crew detach and inject into Mars orbit. The Martian moons then become a source of materials in addition to nearby asteroids. Eventually enough propellants are produced locally for trips to the planet's surface.
 Chemical rockets consume a lot of propellants traveling back and forth from the surface. In the longer term, some combination of skyhook and surface catapult can replace most of that. These would be large projects, but the propellant savings for each trip makes up for it. Carbon from asteroids or the moons, and basalt from Mars, can be used to make the strong fibers for such systems.
 Skyhooks can start small with low capacity, but their orbit parameters and timing would be shifted from bulk going up. Linear or rotary electric catapults on the surface are attached to the planet and not affected this way. To limit drag losses they would be built on the large Martian volcanoes. Mixed use of both systems is also possible. It is too early to choose among these or other options, but chemical rockets are inefficient. In the long run something better would be preferred.
:'''Mars Production'''
 Like other phases of our program, the production in the region starts with mining raw materials for basic products with ready-to-use equipment. Seed factory equipment is delivered to orbit and the surface as needed. This bootstraps more diverse, larger scale, and advanced production. The supply chain from Earth and intermediate regions supports this with regular deliveries.
 Mars has a different history than asteroids, so it likely has sources of volatile compounds and minerals not common in the orbital regions. Very efficient bulk transport is desirable for an export market to develop. Because the gravity well of Mars requires large-scale systems to do this, exports may not be economic right away, but rather need a build-up period in the region first.
:'''Living in Mars Locations'''
 Living in the orbital region around Mars would be similar to high orbits around Earth or the interplanetary region that surrounds both. There would be minor differences in available solar energy and local material sources. Living on the surface would require adapting designs to local conditions of gravity, temperature, and other parameters. Since gravity is 3/8 Earth normal, that includes how to maintain health for people and other living things. Example methods are body weights and rotating habitats.
 '''[https://en.wikipedia.org/wiki/Terraforming Terraforming]''' Mars has often been suggested because it is already the most similar place to Earth. Doing this for a small population is likely too much effort for the amount of use it would get. When the population gets large enough or technology has advanced enough the local population (Martians) can decide if terraforming makes sense. Self-improving production systems can make such a project easier.
 An alternate approach is to use habitat domes to provide a feeling of being outdoors. Internal pressure would be much higher than outside. So lightweight domes need a lot of structure and anchoring to avoid lifting off the ground. Domes can be weighted down by bulk soil and rock, or using thick glass. These also provide radiation, temperature, and impact protection.
==='''9.3 - Phase 5C: Venus and Mercury Locations'''===
 
 '''[https://en.wikipedia.org/wiki/Venus Venus]''' and '''[https://en.wikipedia.org/wiki/Mercury_(planet) Mercury]''' are the next in difficulty after Mars. They have abundant solar energy available, but as a result are mostly very hot. There are relatively few nearby asteroids to start orbital development with.
:'''Venus and Mercury Features'''
 The Venus and Mercury regions include the planets, and relatively stable orbits within 600,000 and 100,000 km of their centers, respectively. Like Earth they are embedded in the Inner Interplanetary region (Section 8.4). They have no known moons. So the main interest is the planets themselves and activity around them. Venus' orbit is nearly circular at 0.723 AU, while Mercury's is 20% eccentric and varies from 0.307 to 0.467 AU.
 Solar flux is 1.9 times higher than near Earth at Venus, and 4.6-10.6 times higher at Mercury. Equilibrium temperatures in sunlight are 17% and 46-80% higher in Kelvin. The surface temperature is 735K (462 C) for Venus, from a thick atmosphere with a strong greenhouse effect. Mercury ranges from below 100K in shadowed polar craters, to as high as 700K at the sub-solar point at perihelion. A given location can vary nearly this whole temperature range due to a 58.6 day rotation period. Venus's rotation takes 243 days, but the atmosphere mostly eliminates temperature changes.
 Venus' surface gravity is 8.87 m/s^2 (90% of Earth), and Mercury's is 3.7 m/s^2, the same as for Mars. Escape velocities are 10.36 and 4.25 km/s from their surfaces and 1,041 and 664 m/s from the outer edge of their regions. Orbits range from 90 minutes to 59 days around Venus, and 85 minutes to 15.5 days around Mercury. Ping times from Earth vary from 4.3 to 30 minutes for Venus, and 9 to 25 minutes for Mercury. Travel times by least energy transfer orbits are 4.8 and 3.5 months respectively.
 The '''[https://en.wikipedia.org/wiki/Geology_of_Venus Geology of Venus]''' appears to be mostly volcanic, and it has lost most of its water to space. The atmosphere has a surface pressure of 9.2 MPa (90.8 times Earth), and is composed of 96.5% CO2 and 3.5% Nitrogen, with some trace gases. While it is very hot at the surface, moderate pressures of 0.5 times Earth and temperatures around 27 C exist at 55 km altitude. Mercury has only a trace atmosphere, and a '''[https://en.wikipedia.org/wiki/Silicate_mineral Silicate]''' surface about 40% O, 25% Si, 11% Mg, 6% Al, 4% each Ca and Fe, and 2% S. Polar regions can have surprisingly moderate average temperatures, and water ice has been found in shadowed polar craters
:'''Economic Uses'''
 Near-term use of Venus and Mercury is more difficult because of the higher velocity to reach them and generally hostile temperatures. Scoop-mining gases from the upper reaches of Venus' atmosphere is a possibility. In the mid-term, floating habitats are possible at altitudes where temperature and pressure are reasonable. Polar stations on Mercury can take advantage of lower average temperatures with proper insulation. In the long term asteroid iron or aluminum can be used for orbiting sunshades to cool both planets where needed.
 Reducing temperature lowers the scale height of Venus' atmosphere, and preferentially lowers the pressure of the high altitude regions of the planet, making them more accessible. There is the possibility that low enough temperatures will promote carbonation of the volcanic surface minerals, further lowering pressures, and that this process can be enhanced artificially. If the surface conditions can be made more tolerable, then large scale access to raw materials plus high energy available in orbit could promote industry.
 It takes 7 to 12 km/s velocity change to travel from near Earth to the Venus and Mercury orbit regions, and therefore 0.15 and 0.27 kg of propellant per kg cargo using electric thrusters. This does not account for gravity assists or skyhook transfers. These require 263 and 474 MJ of solar power respectively. If the cargo is all solar arrays, or equivalent thermal power generation, they will produce an additional 13.75 and 91.5 MJ/day added power output, and repay the extra energy use in 19 and 5.2 days respectively. So energy-intensive processes highly favor going closer to the Sun.
:'''Venus and Mercury Transport'''
 Higher orbit speeds as you get closer to the Sun means more velocity changes are needed to reach them. Like elsewhere, gravity assists and skyhook systems can help do this more efficiently. Solar-powered electric propulsion is quite viable closer to the Sun. Solar flux increases faster then velocity changes, so this introduces the possibility of solar sails as an additional transport method in the inner regions. The advantage of solar sails is they do not consume propellant. But in the outer Solar System low solar energy makes them very slow.
 For example, reflected sunlight provides 15.5 Newtons/km^2 at Venus, and a 1 micron thick Magnesium-Aluminum sail would mass 2400 kg/km^2. This generates 558 m/s/day acceleration for the bare sail. This is reduced by the remaining structure and cargo mass, and by angling the sail to control thrust direction. This acceleration is comparable to that for electric propulsion using solar array mass near Earth. A combined system can take advantage of reduced propellant use from a sail and wider thrust angles from the electric engines.
:'''Venus and Mercury Production'''
 Production in the Venus and Mercury regions would likely start in orbit as an extension of Inner Interplanetary activity. The higher solar flux relative to energy needed to reach inner orbits favors processes that need lots of energy. Raw materials can come from nearby and imported asteroid sources, and possibly scoop mining gas from Venus orbit. There are only 59 known asteroids whose orbit is entirely inside Earth's, and less than 2500 others whose orbit is smaller than Earth's and cross inside of it. This is only 0.2% of the total known, so many materials may have to be imported from farther away.
 Habitats to support production, with artificial gravity, thermal, and radiation shielding can be built in more developed regions and transported to Venus and Mercury orbit to start with. Surface catapults are possible from Mercury's polar regions, where temperatures are more moderate. The combination of materials delivered at least partly by solar sailing and abundant solar energy should allow production to grow in time.
:'''Living at Venus and Mercury'''
 Living in orbits around the two planets would be similar to the nearby interplanetary region, and not require much new design. The planets themselves are mostly hostile in their current state, so we expect few other habitats would be built beyond possible science and exploration outposts in the mid-term. If planet-scale terraforming becomes feasible, mostly by blocking excess sunlight, non-industrial habitats may develop in the long-term.
==='''9.4 - Phase 5D: Jupiter System Locations'''===
 
 Development of the '''[https://en.wikipedia.org/wiki/Jupiter Jupiter System]''' would likely follow the Mid-Interplanetary (Section 8.5), as its orbit is near the outer edge of that region. It isn't clear if the Jupiter region will be easier or harder to develop than Venus and Mercury.
:'''Jupiter System Features'''
 The Jupiter System includes the largest planet in the Solar System (317.8 Earth masses), and reasonably stable orbits around it with semi-major axes less 25 million km. It includes four '''[https://en.wikipedia.org/wiki/Galilean_moons Galilean Moons]''' more than 3000 km diameter, named as a group after their discoverer. As of 2023 there are 91 known '''[https://en.wikipedia.org/wiki/Moons_of_Jupiter Smaller Moons]''' from 1-170 km in size. The larger moons can support their own reaxonably stable orbits, and can be used for gravity assists to change orbits in the Jupiter system.
 Solar flux varies from 3.3-4.1% of that near Earth, so concentrating reflectors are useful in this region. Escape velocity is 59.5 km/s from just above the atmosphere, or an added 24.6 km/s from low orbit. Escape is 3.11 km/s from the edge of the region. Orbit periods range from 174 minutes to 2.26 years. Travel time from Earth by minimum energy orbit is 2.7 years, while gravity assists and other propulsion methods can increase or decrease the time. Ping time is 1.06 to 1.85 hours, depending on relative orbit locations.
 Jupiter has a strong magnetic field which creates intense radiation belts. This ranges from high to immediately deadly levels for unprotected people, and can rapidly degrade even shielded electronics. Outside these belts, the usual solar and galactic radiation is still a hazard. Temperature in Jupiter System orbits are about 217K (-56 C) for black objects, and less for lighter colored ones. Jupiter is a Gas Giant, and therefore has no solid surface. The atmosphere is 90% Hydrogen, 10% Helium, plus trace gases. Orbit minus rotation velocity is 29.5 km/s, making it very difficult to access the planet itself or even mine the atmopshere from orbit.
 The four large moons (Io, Europa, Ganymede, and Callisto) orbit 0.422, 0.671, 1.07, and 1.88 million km from Jupiter in nearly circular orbits. They have a combined surface area of 232.8 million km^2, or 1.56 times the land area of Earth. They have negligible atmospheres. All four are tidally locked to Jupiter, so their days are equal to their orbit periods of 1.77, 3.55, 7.15, and 16.7 days. Surface gravity varies from 1.23 to 1.80 m/s^2, or 12.5 to 18.4% of Earth.
 Io's surface is volcanic deposits and sulfur compounds. The other three large moons are either entirely or partially covered in ice, with various minerals and frozen compounds making up the rest of their surfaces. Surface temperatures of the large moons range from 70-165K, except for volcanic hot spots on Io, and vary mostly by latitude and how close they are to Jupiter, which determines how much reflected light they get on the near side.
:'''Economic Uses'''
 Use of the Jupiter System would likely follow the Main Belt and Trojan locations in Phase 4D. There are 12,500 Jupiter Trojans vs 91 smaller moons around Jupiter, and the Trojans are much larger in total mass. Since Jupiter's gravity well requires more velocity to navigate, there is no particular reason to use the smaller moons except as a way to access the larger ones. The outer Jovian moons are likely captured asteroids, and are the same Solar distance as the Trojan group. So they don't represent new technical challenges.
 The large moons together have 6.6% of Earth's mass, or 5.4 times that of Earth's Moon. They can be a very large source of materials, with some significant variations in composition. Early uses are likely to be mining-based, with return of materials to more developed regions. Even the largest moon, Ganymede, has a low enough orbit velocity that a catapult or skyhook can deliver directly to orbit, after which an electric tug can transport it elsewhere. Water is widely available in the Jupiter System, both for life support and propellant. High radiation close to the planet requires careful design for habitats and electronics. Remote control from a safe distance is a possibility.
:'''Jupiter System Transport'''
 Transport from the Mid-Interplanetary region and closer to Earth can start with electric propulsion, and for people use shielded habitat modules. High-thrust landers can be used to start with for the large moons, while skyhooks and catapults can be brought or built later for higher efficiency. Since these would already be developed for previous locations, not much new design would be needed except for radiation protection close to the planet. Transfer habitats in cyclic orbits with heavily shielded sections is a design option. Those sections are used when when close to the planet. We don't expect to land on or mine Jupiter itself until far in the future because of the extremely high energy required. The other Gas Giants are easier to access and have milder radiation belts.
:'''Jupiter System Production'''
 Growth of local production follows the usual path of mining first, then bringing seed factory equipment to bootstrap other industries. The smaller outer moons can be an early source of fuel and water. Rocky and metallic materials may need to be imported from the surrounding regions, depending on the composition of the moons. Large reflectors would be a desirable early product to generate power and heat.
:'''Living in the Jupiter System'''
 Living in the outer parts of the Jupiter system is very similar to the Trojan asteroid regions, as they are the same average distance from the Sun. Only '''[https://en.wikipedia.org/wiki/Callisto_(moon) Callisto]''' among the large moons has tolerable radiation levels at its surface. The closer moons and orbits around and among them require significant shielding. Water is a good shielding material, and all the large moons have lots of it.
==='''9.5 - Phase 5E: Outer Giant Locations'''===
 
 The three outer giant planets, '''[https://en.wikipedia.org/wiki/Saturn Saturn]''', '''[https://en.wikipedia.org/wiki/Uranus Uranus]''', and '''[https://en.wikipedia.org/wiki/Neptune Neptune]''', are next in difficulty from distance and lower solar energy. This is compensated somewhat by lower masses than Jupiter, so smaller velocity changes are needed to work around.
:'''Outer Giant Features'''
 The three planets average 9.55, 19.22, and 30.11 AU from the Sun. These planets and their orbital regions are embedded in the Outer Interplanetary region of Phase 4E (Section 8.6). Saturn's orbital region extends 30 million km from the planet center, and includes 83 '''[https://en.wikipedia.org/wiki/Moons_of_Saturn Known Moons]''' as of 2023. Eleven of these moons are larger than 100 km, of which five (Tethys, Dione, Rhea, Titan, and Iapetus) are larger than 1,000 km, with Titan being 5,150 km in diameter (75% of Mars).
 Uranus' region is 24 million km in radius, and has 27 known '''[https://en.wikipedia.org/wiki/Moons_of_Uranus Moons]'''. Five of them (Miranda, Ariel, Umbriel, Titania, and Oberon) are considered major, ranging from 470 to 1575 km in diameter. Neptune's region is 50 million km radius, and has 14 known '''[https://en.wikipedia.org/wiki/Moons_of_Neptune Moons]''', of which Triton is by far the largest at 2700 km diameter. The larger moons of all three can support stable orbits and enable gravity assists. All the giant planets, including Jupiter, have ring systems. Saturn's is the most massive at an estimated 30 million Gigatons, almost as much as the 400 km moon Mimas, which orbits nearby.
 Solar energy is weak in these regions, about 1%, 1/4%, and 1/9% of that near Earth. Large reflectors would be needed to bring sunlight to useful levels. Nuclear power may be more effective. Escape velocities are 35.5, 21.3, and 23.5 km/s from each planet, and 1,535, 682, and 255 m/s from the edge of their regions. Orbit periods are vary from 250, 180, and 155 minutes close to the planets, to 3.8, 9.9, and 27 years at the edge. Travel times are 6, 16, and 30 years by minimum energy orbits. Gravity assists and added propulsion can shorten the trips.
 Ping times average 2.65, 5.33, and 8.35 hours, plus or minus about 20 minutes for relative planetary positions. Radiation levels around Saturn are about as high as Earth's Van Allen Belts, so added shielding is needed for people and electronics. It is most intense between the ring system and the moon Enceladus. Radiaition around Uranus and Neptune are lower, but still include the solar and cosmic background flux present in most parts of the Solar System.
 Like Jupiter, the outer Giants have no solid surface. Their atmospheres get denser with depth until they are beyond the '''[https://en.wikipedia.org/wiki/Critical_point_(thermodynamics) Critical Point]''' and reach liquid density and higher. The upper portions are 96% hydrogen, 3% helium for Saturn; 83% hydrogen, 15% helium, and 2.3% hethane for Uranus; and 80% hydrogen, 19% helium, and 1.5% methane for Neptune. All three have small amounts of trace gases. Orbit minus planet rotation velocities are 15.2, 12.5, and 13.9 km/s. Scoop mining their atmospheres would be hard, but should be feasible.
:'''Economic Uses'''
 The outer Giant regions are too far for near-term use. Their development could start once the Outer Interplanetary region around them is accessible. The first use is likely to be mining various raw materials. The combined total of 124 moons and one major ring system around these planets have a mass of 1720 x 10<sup>20</sup> kg, or 2.34 times the Moon. This is a very large source of materials, but their distance means mining them will be delayed. Mined material would likely be brought back back to inner regions where there is more energy for processing and projects that need them. Other uses besides mining are too far in the future to predict right now.
 Titan has a thick Nitrogen atmosphere (1.4 times Earth pressure) with 1.4% Methane at upper levels and 4.9% at lower levels. Low orbits are about 1.8 km/s, so scoop-mining this atmosphere is particularly easy. Helium-3 has been proposed as a low radiation fusion fuel. Fusion in general has not yet been solved, and the He-3 reaction is 10 times harder than deuterium-tritium (D-T), which is the main target of current research.
 If either kind of fusion becomes feasible, scoop-mining the outer Giant atmospheres may become economic because of its high energy output, and the light gases also make good propellants. All three giants have deuterium, and Uranus and Neptune have the highest concentrations of Helium in their atmospheres, and thus the He-3 isotope. The easier D-T fusion should enable trips to these planets in reasonable time.
:'''Outer Giant Transport'''
 Chemical rockets have sent probes to the outer planets, but this is very inefficient. As in other regions, gravity assists from massive bodies, surface catapults, and skyhooks can be used to improve transport efficiency. Solar power has been used for probes as far as Jupiter and its Trojan asteroids, but reflectors to increase power for propulsion in farther regions hasn't yet been developed. Current work is on small fission reactors for a variety of uses, including nuclear-electric propulsion, which would be much more efficient than chemical.
 Fission and fusion fuels have high energy content but the reactors to use them tend to be higher mass than solar power. The also emit harmful radiation, but most parts of the Solar System are already filled with it anyway. The same shielding can protect from both sources. Nuclear fuels are also relatively rare compared to silicon used for solar cells or aluminum/magnesium alloy for concentrating reflectors. It isn't clear what the best energy source for future propulsion will be.
:'''Outer Giant Production and Living'''
 We don't expect activities beyond science, exploration, and mining in these regions until technology improves significantly from current levels. Since we can't predict what improvements will be made in the long-term, we will leave what local production and habitation is possible as an open question.
=='''10.0 - Interstellar Locations'''==
 
 The last major phase of our program involves interstellar locations. The key difference that warrants a new phase is the extreme distances involved. This breaks the ability to deliver things from the Solar System and communicate with it in a reasonable time. Deveopment of these locations would require high self-sufficiency in transport, enough starting materials, and self-improving systems capable of growth without outside assistance.
 Phase 6 projects are far enough in the future that we can only speculate about them in general terms. We include it mainly as a place-holder and to give direction for future long-term work. We divide it into two sub-phases - the spaces between stars, and those around other star systems. Since you must cross interstellar space before reaching the other systems, logically the sub-phases are in that order.
==='''10.1 - Phase 6A: Interstellar Space Locations'''===
 
:'''Interstellar Features'''
 We define the Interstellar region as starting 100,000 AU from the Sun, where nearby stars and the Milky Way galaxy as a whole begin to contest the Sun's gravity. There is no outer limit for this region beyond whatever travel distances are possible from future technology. Since we don't know what those future technologies will be, for now we will arbitrarily set a boundary of 20 light years from the Sun.
 Probably the most significant feature of this region is that star systems are all in relative motion to each other, with an average velocity of 50 km/s. This is on top of the general rotation of the galaxy at about 225 km/s. As of 2023 there are 131 known '''[https://en.wikipedia.org/wiki/List_of_nearest_stars_and_brown_dwarfs Stars and Brown Dwarfs]''' in the 20 light year "Solar Neighborhood". Given their average velocity, they will travel 20 light years in 120,000 years, so the membership of the neighborhood will change about every 1250 years on average.
 The local interstellar region is very low density gas, at ~0.3 atoms per cubic centimeter, or 1 gram per 564 km cube. That does not include cometary clouds around stars, or wandering objects between them. We know very little about such smaller objects, but assume some exist by similarity to our own Solar System.
 The Interstellar environment between stars is not much different from distant orbit environments in Phase 4F (Section 8.7). Stellar energy is effectively zero, and while stellar radiation is not a factor in this region, cosmic radiation still is.
:'''Economic Uses'''
 We don't know enough about material resources and energy sources in this region to propose economic uses. The distance to the Sun detaches any industries from regular trade with the rest of civilization. Science, exploration, and seeding interstellar colonies are possible long-term activities.
:'''Interstellar Transport'''
 Interstellar transport can be divided into slow and fast types. The slow type is on the order of stellar velocities (5-500 km/s). An example is a large habitat with large material reserves and fusion power as an energy source. It can subsist on the cometary clouds around stars and unbound objects between them. When it gets close enough to a selected star, it can enter orbit and travel with it. Such habitats would be based on previous space habitats in the Solar System, so it doesn't require a lot of new development.
 Travel times between stars at these speeds would average 3000 years or longer. Such times are long enough that technology changes during the trip are a factor. Trying to reach a specific star doesn't make unless technology had reached a plateau or making improvements in transit was planned for. If the habitat is considered a permanent place to live that happens to be moving to access new resources, speed of travel is less of an issue.
&emspFast interstellar puts much more energy into transportation, to reach higher velocities and shorten time to a destination. Possible methods include fusion-powered engines and beamed power using the Sun as a gravitational lens for focus. Rather than a large habitat with a full range of civilized activity, fast interstellar operates more like ships on Earth, with a crew dedicated to reaching a destination and maintaining operations. We don't yet know what interstellar transport methods will prove feasible, if any, and the other space-related technologies available by then, so this is all speculative for now.
:'''Interstellar Production'''
 We don't know enough about resources in this region to consider gathering raw materials. So the only production we can plan for now is what they bring with them. If they start with a large reserve, such as a captured comet nucleus, it can be used for supplies, maintenance, and upgrades.
==='''10.2 - Phase 6B: Stellar Locations'''===
 
:'''Stellar System Features'''
 We define stellar regions as those surrounding individual stars, brown dwarfs, or multi-object systems, of which there are 94 within 20 light years. The size of the regions are scaled to the square root of the system mass divided by Sun's mass, times 100,000 AU. This is their region of gravitational dominance and any cometary cloud bound to them.
 Stars and brown dwarfs are bright enough to find with current equipment. In fact 22 star systems within 20 light years can be seen from a dark location on Earth without optical aid. We have basic information about planets and disks around other stars. Their parent stars tell us where to look, and the stars themselves provide data about the planets from Doppler shifts and transits.
 The number of discovered planets at all distances is growing rapidly, from none before 1988 to about 2000 by the end of 2015, and over 5000 by 2023. 59 of them are within 20 light years. Dust and gas in '''[https://en.wikipedia.org/wiki/Circumstellar_disc Disks]''' around younger stars are visible to current telescopes, but none are within 20 light years. Two nearby star systems, epsilon Eridani and Tau Ceti, are known to have longer-lived debris disks.
:'''Economic Uses'''
 Due to extreme distance, the only economic uses we see for now are science, exploration, and seeding independent colonies. More study is needed with better telescopes before any attempt to plan travel to these stars.
:'''Exostellar Transport'''
 Transport between stars is covered under Phase 6A in the previous section. Travel within a given stellar region would use the same technologies as around the Sun, with modifications for available energy sources.
:'''Exostellar Production'''
 As mentioned earlier, we would want to observe the nearby stars in more detail by using the Sun as a giant gravitational lens. Following that would likely be robotic probes to more closely examine whatever is found around these stars. A self-bootstrapping seed factory approach should work at other stars, since the properties of energy and matter are the same everywhere. However the details will depend on what resources are available.
</div>
dtr23lyznyhwo7edc1xmnjucl3gfzng
4669656
4669649
2026-09-11T09:51:03Z
Danielravennest
13526
/* 8.0 - Phase 4: Orbital Locations */ Update ti end 8.1
4669656
wikitext
text/x-wiki
{{DISPLAYTITLE:<span style="display:block;text-align:center;font-size:100%;background:#d0f0f0;line-height:2.5em;font-family:'Georgia', serif";">Building Better Worlds in the 21st Century</span>}}
<div style="font-size:125%;font-family:'Georgia', serif;">
:'''Dani Eder,'''
:''The Seed Factory Project,''
:''6485 Rivertown Rd, Fairburn, GA, 30213''
:''email: danielravennest@gmail.com''
:'''Aug 2026'''
'''Note:''' This report is an introduction to the ideas and work of the Seed Factory Project to date, which are covered in more detail in the two volume '''[https://en.wikibooks.org/wiki/Seed_Factories Better Worlds]''' set.
<div class="nonumtoc">{{TOCright}}</div>
=='''0.0 - Summary'''==
 
  National space programs to date have been based on the idea of going to one place at a time, like the Moon and Mars, for reasons like science and national prestige. Missions have finite goals and end when they are reached, so they don't include full development of the destinations. Instead, equipment and supplies have come from Earth, which kept costs high. Limited goals and high cost resulted in poor return on effort.
 Our project proposes a broader approach of upgrading and extending civilization on Earth first, then full development of the entire Solar System, and eventually beyond it. It is based on the idea self-improving production systems that grow from a starter set of core equipment called a '''[http://en.wikibooks.org/wiki/Seed_Factories Seed Factory]'''. Seed factories make more equipment for themselves mostly using local energy and raw materials. This is in addition to making finished products like any other factory.
 Each location follows a growth cycle of self-improvement, making products for local use, trade with the rest of society, and becoming economically self-supporting. Once matured, a location sends elements of new starter sets to new locations. Locations are developed in logical progression from easier to harder and more distant. With proper planning locations can be sustainable, and even reduce unwanted side effects on the environment.
 The very large physical space, materials, and energy resources beyond Earth enable large total returns. Since locations grow to support themselves, the net cost of such a program is only the initial start-up, so the return on effort is high.
 It isn't in the scope of this report to provide detailed plans and hardware designs. What we describe is a possible path that leverages self-improving production methods. This is a step towards solving existing problems and building a better future, but much more work is needed for this idea.
=='''1.0 - Problems of Past Space Programs'''==
 
 Governments have pursued space projects and programs, individually or in groups, for purposes like research, exploration, advancing technology, and prestige. While the results can be large, these efforts often suffer from outdated assumptions, high absolute costs, low relative return on effort, and a focus on single destinations. They have also often not leveraged new knowledge and technology.
:'''Outdated Assumptions'''
 Sending people to the Moon and Mars are stated goals of '''[https://www.space.commerce.gov/policy/national-space-policy/ US National Space Policy]'''. Significant annual budgets are being spent towards these goals, primarily on the '''[https://en.wikipedia.org/wiki/Space_Launch_System Space Launch System]''' and '''[https://en.wikipedia.org/wiki/Orion_(spacecraft) Orion Spacecraft]'''. The program concept to reach these goals is directly descended from plans first made in the mid-20th Century, such as '''[http://launiusr.files.wordpress.com/2011/08/mars_high.jpg Von Braun, 1954]'''. In the decades since, the technologies to be used have advanced, but the overall concept has not. In NASA's '''[https://www.nasa.gov/sites/default/files/atoms/files/journey-to-mars-next-steps-20151008_508.pdf Journey to Mars]''' (pdf file Oct 2015), the "mission" approach includes a number of assumptions:
* It is a round trip for the crew, from Earth to Mars and back, with limited duration on the Martian surface.
* Because the number of missions is small and they are short, it is not economic to develop many local resources.
* Most or all equipment and supplies are launched from Earth.
* High cost limits mission mass. So crews have to accept risks from radiation exposure, equipment failure, and lack of fallback positions.
 Other goals like the Moon and orbiting stations have similar limiting assumptions, and are considered separately from each other.
:'''High Cost'''
 Government-funded and contractor-built space programs have little incentive on either side to finish promptly or keep costs under control. Project-oriented agencies want to continue their existence, but getting approval for new projects is hard. Contractors want to earn as much as possible, but winning new contracts by competitive bidding is uncertain. Politicians who decide on budgets want to preserve jobs in current locations, which works against cost savings.
 The incentives on all sides have led to low cost estimates to get project approval. The tacit understanding is real costs will gradually be revealed as the work progresses. Spent funds deter cancellation as the full costs are revealed, because the funds would then have been wasted on an unfinished project. This pattern avoids frequent approval for a new project or competing for new work. The project schedules are instead stretched to fit real cost to available annual budgets. The result is a few big "can't fail" projects. Public failures risk losing funding or even an agencies' existence. So projects must be conservative, slowing progress.
:'''Low Returns'''
 In terms of exploration and science, a trip going to one place like Mars, and bringing back perhaps a few hundred kg of samples, is not much return for the effort expended. Relatively short round trips do not allow for full exploration of a landing site, much less a planet with the land area of Earth. Lack of refueling stations and reusable vehicles limits sample mass that can be returned to Earth, where researchers and laboratories can fully analyze them.
 If most items have to be launched from the deep gravity well of Earth, then delivery costs will be high, and increase linearly with the number of missions. High transport cost limits weight, and in turn safety features like adequate radiation shielding, backup vehicles, and spare parts and supplies. To minimize risk, what is built must be both lightweight and near-perfect, which is also expensive. Despite that, crew risk is still high in absolute terms. The combination of low return and high cost have delayed going to the the Moon and Mars for decades. Such a program is now moving forward, but very slowly.
:'''Focus on the Moon and Mars'''
 The Moon is nearby, big, and obvious to everyone on Earth. So it was a natural first destination for human exploration. Venus and Mars are the closest major planets. Venus was originally thought a suitable destination because of similarity of orbit, mass, and gravity. However it turned out to be very hot from a thick CO2 atmosphere. Mars then became the next focus of human exploration by being the most Earth-like and nearby destination.
 The focus on Earth-like conditions ignores that on Earth, even the best places require some technology to survive, and more of it to be comfortable and flourish. At a minimum clothing, shelter, and agriculture, are needed, with their underlying technologies. For most of the Earth technology like ships, planes, and snow crawlers are needed to reach places, and more technology if you intend to stay.
 Mars, or anywhere else in space, also require technology to survive and flourish. But Mars does not require dramatically more than harsh places on Earth. For example the temperatures on Mars overlap those of cold places on Earth, such as Siberia and Antarctica. At the same time, the surface of Mars is harder to reach than other regions in space. Getting there needs more work than high orbits near Earth. The colder surface temperatures and 80% lower solar flux require more equipment than near Earth. A primary focus on the Moon and Mars over everywhere else is a mistake. They are large, interesting, and can be useful. So they should be part of future programs, but not to the exclusion of other places.
 A new approach is needed that remedies the problems noted above. It should be based on up-to-date knowledge of the Solar System and new technologies developed since the mid-20th century. It should explore and use all of the many places in the Solar System. That includes the orbital and interplanetary spaces around and between natural objects. Finally, it should have high science and economic returns for the effort expended, including direct returns to people on Earth.
=='''2.0 - New Knowledge and Technologies'''==
 
 Our new approach starts with a modern overview of the Solar System and its resources. We then introduce technologies to access and use those resources. Self-improving production systems that become highly efficient with "Smart Tools" is key among these. Our intent is to use these to benefit civilization and the Earth's environment.
==='''2.1 - The Modern Solar System'''===
 
 The Solar System as of 1950 included 9 planets and their moons, plus about 2,000 asteroids in the belt between Mars and Jupiter. Materials would be available on the surfaces of the Moon and Mars, but required significant fuel to take elsewhere. So they would only be used locally. Energy would come from solar-powered steam turbines, or a little later from fuel cells. These ideas are quite outdated and becoming more so each year.
 Today we can inventory the known Solar System in terms of its material and energy resources. Such '''[https://en.wikipedia.org/wiki/Natural_resource Natural Resources]''' on Earth are well-studied and understood. Most people today know about the Moon, the other major planets, and that some of them also have moons. So here we will mainly review the more recently found and less familiar parts Solar System.
 In terms of resource access, the smaller members of the Solar System all take less energy to land on and remove materials from than Earth. They also have greater surface area relative to mass and lower gravity, making extraction easier.
:'''Material Resources'''
 '''[[w:Near-Earth_object|Near Earth Objects (NEOs)]]''' are those which come closer than 1.3 AU to the Sun, where 1 AU is the Earth's average solar distance. Mars' orbit ranges from 1.38-1.67 AU, so NEO's are "on the way there" in terms of solar distance. In 1950 time there were 55 such objects known, of which only 13 were asteroids. The rest were comets, which are easier to find when they have large tails. The asteroids were ignored because their orbits were not ideal, and mining them was still a subject for science fiction.
 This has changed dramatically. As of August 2026 there are over '''[https://cneos.jpl.nasa.gov/stats/totals.html 42,000 known NEOs]'''. The number has increased exponentially since about 1980 as better telescopes have been used to find them. These searches are partly driven by the impact risk such objects pose to Earth. Of those found so far, 875 are asteroids 1 km or larger in size, a nearly full count. 11,700 are larger than 140 meters out of an estimated 27,000 total. The rest are smaller, with perhaps 4 million to be found larger than 10 meters ([https://iopscience.iop.org/article/10.3847/1538-3881/aa8036 '''Trilling, 2017''']). 124 of them are comets, which lose material when close to the Sun. Just the largest handful of NEOs have a combined mass of 50 trillion tons, which is roughly a thousand years of mining activity on Earth.
 The much larger numbers known today means more of them are in orbits easy to reach from Earth or on the way to Mars. Very efficient '''[https://en.wikipedia.org/wiki/Spacecraft_electric_propulsion Electric Propulsion]''' and other technologies unknown in 1950 time now exist. They make it possible to reach NEOs and work with them remotely from Earth, as recent asteroid and comet probes have done. Early research has been done on '''[https://en.wikipedia.org/wiki/Asteroid_mining Asteroid Mining]''' and '''[https://en.wikipedia.org/wiki/Space_manufacturing Space Manufacturing]''' to make use of their materials. Using NEOs as sources of propellants, supplies, and other products would greatly reduce what you need to bring from Earth for space projects.
 Beyond those that come close to Earth, the '''[https://www.minorplanetcenter.net/mpc/summary Total Number]''' of known objects in the Solar System, as of August 2026, is 1.56 million. This is about 780 times what was known in 1950. The list of such '''[https://en.wikipedia.org/wiki/List_of_minor_planets Minor Planets]''' has grown rapidly as new dedicated telescopes and search techniques were applied, and is expected to increase by another factor of 10 now that the '''[https://en.wikipedia.org/wiki/Vera_C._Rubin_Observatory Rubin Observatory]''' has begun operating.
[[File:Inner_solar_system_objects_top_view_for_wiki.png|thumb|right|600x600px|Figure 2.1-1 - Inner Solar System objects.]]
 91.7% of known objects are in the '''[https://en.wikipedia.org/wiki/Asteroid_belt Main Asteroid Belt]''' between Mars and Jupiter (Figure 2.1-1), but many thousands of others are in orbits throughout the Solar System. The '''[https://minorplanetcenter.net//iau/lists/MPLists.html Minor Planet Center]''' maintains information about all of them. The high proportion in the Asteroid Belt is a function of distance, not absolute numbers. Brightness decreases as square of both distance from the Sun and the telescope. So discoveries are strongly biased to nearby objects, and to only finding the largest ones at greater distances. But total number of objects goes up about 3,500 times when the size goes down by 100 times. So there are many more smaller objects still to be found.
 Many of the objects discovered beyond Neptune, at 30-80 AU, have '''[https://en.wikipedia.org/wiki/Orbital_eccentricity Eccentric Orbits]'''. These objects tend to be found at the close end of their orbits, when they are bright enough to see. This additional discovery bias means there are many more like them waiting to be found, but are currently in more distant parts of their orbits, or never come close enough to find with current telescopes. The August 2026 count of about 8300 such distant objects is limited to those larger than 100 km for the farthest ones. As search methods improve, many more such objects will be found at all distances and more of the smaller ones.
 '''[https://en.wikipedia.org/wiki/List_of_near-parabolic_comets Near-Parabolic Comets]''' can reach distances measured in light-years, or even escape the Solar System entirely. Aside from them, the known size of the Solar System has increased 168 times since 1995, from 49.3 AU for Pluto to 8285 AU for the maximum distance of Centaur object '''[https://minorplanetcenter.net/db_search/show_object?object_id=2015%20FW539&commit=Show 2015 FW539]'''. Some of these objects are quite large (Figure 2.1-2), and there is even a suspected major planet still to be found. Although the absolute distance of these objects is very large, the energy to reach them has a finite limit. The five planetary probes '''[https://en.wikipedia.org/wiki/List_of_artificial_objects_leaving_the_Solar_System Leaving the Solar System]''' already have more energy than needed to reach anything in the Solar System. The practical limit is set by how long it takes to reach and use them.
[[File:Trans-Neptunians_Size_Albedo_Color.svg|thumb|right|512x249px|Figure 2.1-2 - Large Trans-Neptune Objects.]]
 The inventory of Solar System objects is now known to be incomplete, especially for small and distant ones. Despite this, there is detailed knowledge of the history, composition, and geology of some of its members, and this is constantly improving. We expect this to continue, especially from future mass-produced probes with efficient propulsion and refueling capability. Many more objects can then be visited than the current handful per decade. As more is learned about these objects, better plans on how to use them can be made. But even with current knowledge, a start on such plans is possible.
:'''Energy Resources'''
 The Sun is an immense energy source, producing 20 trillion times what human civilization uses today. That energy streams in all directions, not just at the objects which orbit it. Mining and building on the surface of Solar System bodies is convenient, but they typically gather half or less of the available solar energy. This is because of day-night cycles, geography, and in some cases atmospheres and eclipses from other bodies.
 It takes significant energy to move materials from the larger bodies to open space, but once there, solar energy is available up to 100% of the time. For example, with current rockets it takes about 480 MJ (134 kWh) to raise 1 kg from Earth to an orbit in full sunlight. Once there, 1 kg of modern space solar panel can extract that much energy in 56 days, but lasts about 100 times longer. Most solar system bodies are smaller than Earth, and there are more efficient ways to lift materials than today's rockets. So from a net energy standpoint it often makes sense to work in open space.
 Solar cells were only 6% efficient in the mid-20th century, so solar-driven steam turbines were part of the original Mars mission concepts. Solar cells are now 47.6% efficient in the laboratory and 31% for space power applications, and continue to '''[https://en.wikipedia.org/wiki/Solar-cell_efficiency Improve]'''. Using lightweight concentrating reflectors, they can be useful even in the outer Solar System. Where heat, rather than electricity, is needed, direct solar exposure or using mirrors can can reach 80% collection efficiency or higher.
 In addition to solar, there are various energy sources that are more limited in scale and availability. These include nuclear fission and potentially fusion, geothermal, and wind. On Earth we use hydroelectric and chemical combustion, but those are not generally available elsewhere. The orbital motion and gravity fields of bodies are not energy sources, but their potential and kinetic energy can be used in various ways. The Sun's output alone, which will last for billions of years, plus raw materials found all over the Solar System, are enough to sustain civilization and the Earth's environment.
:'''The Illusion of Scarcity'''
 Current civilization is actually quite limited, even on Earth. The urban, forest, and farm land used in any significant way amounts to only 13.5% of the planet's surface. The remainder are oceans, deserts, and ice caps that are only traveled through or barely used. Of the part that is used, the average depth is equivalent to a thin surface layer.
 The world's biosphere (about 2000 Gigtons) plus the human built environment (about 1100 Gigatons) averages about 6 kg/m<sup>2</sup>, while the Earth's total mass to area is 11.71 billion kg/m<sup>2</sup>, or a ratio of one part in 2 billion. At the density of water, the biosphere plus civilization amounts to a 6 mm (1/4 inch) thick layer across the planet's surface. If we only consider the fraction of the planet used, the equivalent thickness is 7.4 times higher, or 4.4 cm (1.75 inches). If this number seems small, it is because most of us live in places that are built up. Life and civilization are very unevenly distributed. Cities and river dams, for example, have much higher built mass per area, while tropical forests can reach 25 times the average biosphere density per area.
 The perceived scarcity of resources is thus an illusion, because we as observers live in the more built up places. Current civilization actually uses only 2 billionths of the planet's mass and one ten-thousandth of the available energy flow. Photosynthesis uses about 13 times more of the available energy, but still only about 1/8% of it. In a literal sense we are only scratching the surface of our own planet. When we consider the whole Solar System, the available resources increase by hundreds of times in mass, and two billion times the energy that reaches Earth.
 A larger fraction of smaller bodies is accessible. On Earth pressure and temperature limits going too deep. Bodies with lower gravity and less hot interiors can be accessed more deeply or all the way through. The much higher total energy across the Solar System would also allow reprocessing and reusing what we consider waste products today. Scarcity would not be a problem if these vast untapped resources could be used.
==='''2.2 - New Technologies'''===
 
 For our approach we want to use the best available production and space technologies, plus some new ones that can be developed in the near future. These include seed factories, production networks, space technologies that are already in use but not yet in government plans, and new ones for space not yet fully developed. This is in addition to more standard existing technology.
:'''Seed Factories'''
 Production systems which use part of their output for self-improvement can grow exponentially. Production can start with simpler tools, but modern technology like computers, communications, automation, robotics, software, and artificial intelligence lets them become more efficient.
 We call a starter set of tools and machines capable of self-improvement using human labor and other energy inputs a '''[https://en.wikibooks.org/wiki/Seed_Factories Seed Factory]'''. They grow to become mature factories by analogy to plant seeds, which grow into mature plants that can produce more seeds. Seed factories can improve in several ways:
* Making parts for additional copies of current equipment.
* Making new types of items not in the starter set, and
* Making different versions of existing equipment (larger, more accurate, etc.).
 While modern technology can reduce the labor needed, some people are still needed today to operate the factory. Like any other factory, some part of its output is for sale or trade. This helps cover the initial cost and paying for items it can't make internally.
 The improvements increase production capacity and the range of products that can be made. Since the capacity to grow increases with the size of the factory, the growth is exponential. The starter or added equipment can include power generation, mining, and materials processing, so the factory can eventually self-supply and self-power from local resources. A seed factory may not use any local sources to start with, but can approach 100% as it matures. Some parts and materials would likely be too hard to make, or too rare locally. So even for a mature factory those would still come from elsewhere.
 When production at a given location is mature enough, it can start supplying parts for, or complete new starter sets. These can be set up in the same area, or sent to new locations, repeating the growth process. Internal growth and making new starter sets highly leverages the initial cost. It fundamentally changes the return/cost ratio of projects for the better.
:'''Locations and MakerNets'''
 When we refer to "locations" we mean a single environment type, with equipment and people that are close enough that they can work together and trade physical items easily. On Earth that might be a single metropolitan area. In less developed places it might be smaller in size from lack of easy local transport. Equipment in a given location may have different owners or control systems, but can still coordinate their work and cooperate on larger projects.
 The collection of coordinating operations forms a network, which we call a '''MakerNet''', after the modern '''[https://en.wikipedia.org/wiki/Maker_culture Maker Subculture]''', who make things. The network has multiple communicating nodes, each of which includes a set of equipment and people who can do tasks. A MakerNet can extend over multiple locations, since data transfer and remote control can operate over long distances at low cost.
 Physical transportation of people and supplies is not as easy, so we distinguish separate locations within a larger network. To the extent local sources can be used, it would lower transport costs. So there is an incentive to ship lightweight items like information over bulk materials.
:'''Space Technologies'''
 New or improved space technologies have been developed since the mid-20th century, but not fully included in existing program plans. These include:
* '''Electric propulsion''' - which uses many times less propellant than chemical rockets. Using large tanks of propellant to deliver relatively small payloads has strongly limited space projects in the past.
* '''Better Materials''' - There are new and significantly improved engineering materials, including high strength fibers, and composite materials that use them. Production methods for them have also improved.
* '''Closed Loop Life Support''' - has been developed which recycles supplies using mechanical equipment or biology.
 Additional technologies that were not specifically developed for space, but can be used for it, include small and powerful computers, their software, other kinds of electronics, robotics, automation, high speed communications, and most recently artificial intelligence (AI) applications.
 Many other space technologies have been proposed, but not yet fully developed. This is either from lack of money and resources, or not enough scale yet to justify them. MakerNets and seed factories can potentially overcome these limitations. Our second volume on '''[https://en.wikibooks.org/wiki/Space_Transport_and_Engineering_Methods Space Systems Engineering]''' collects current and future space technologies that we know of, so they can be considered for future planning and projects. Some new transport examples are ground-based accelerators and air-breathing engines for reaching orbit, and '''[https://en.wikipedia.org/wiki/Skyhook_(structure) Rotating Skyhooks]''' for artificial gravity and orbit transfer.
 
=='''3.0 - New Program Concept'''==
 
 For discussion purposes we refer to this as a program, with component phases and projects. But we do not expect it to be under centralized government direction. Instead it would include independent businesses operated for profit, public/private partnerships, incentive prizes, some government effort, and other project methods.
 This section summarizes our goals and approach. The rest of this report, and our other documents, provide more details. This is a work in progress. It is by no means a finished proposal or a final design. It likely never will be, as the future brings new discoveries and technologies. We have identified new goals and methods, and made a start at the details, but much more work is needed. Our work is open-source, so feel free to build on it, provide feedback, and contribute your own ideas.
:<u>'''Goal 1 - Benefits on Earth'''</u>
 Existing government space program goals are mainly for defense, science, exploration, and national prestige. They have limited budgets because they compete with other government priorities. Our approach is to go beyond these limits, to include the full range of civilized activities, both on Earth and in space. About billion times more people live on Earth right now than in space, and their needs are much larger and more immediate. So our first goal is to address problems on Earth, starting with easier ones, then moving towards the more difficult.
 Competition and the profit motive have often demonstrated faster and cheaper results, so we want to take advantage of them. If there is money to be made, there is a vast pool of capital available beyond government budgets. The $429 billion '''[https://sia.org/news-resources/state-of-the-satellite-industry-report/ Global Space Economy]''' in 2025 was already mostly commercial activity, and 17.6 times NASA's budget.
 The original '''[https://ntrs.nasa.gov/citations/19830007077 1982 Version]''' of the seed factory idea was intended to enable large space projects by production in space. But the laws of nature and how technologies work are the same everywhere. If networks of exponentially improving and multiplying systems can work in space, they will work on Earth too. The operating environments, local raw materials, and energy sources may differ by location, but the underlying principles are the same.
 The early versions of seed factories would most likely be built in higher income areas. These are the easiest places to start because equipment, materials, and energy sources are readily available, as are people who know how to work with them. Conventional jobs have always been at risk from economic and business changes. In the future they may be permanently replaced by the same kinds of advanced technologies seed factories can use. Self-built and self-owned production can supplement or replace conventional work for hire.
 As the owners of production capacity, people can more securely meet their basic needs. They get the benefit of the output regardless of how much labor is replaced by technology. Self-improving systems can grow to mostly copy themselves, so they would become low cost to build. They can also become highly automated and use renewable energy, making them low cost to operate.
 A growing network of productive systems can then be extended to lower income areas on Earth. This allows bypassing fossil fuel development and the problems it creates, while gaining the comforts, health, and safety found in higher income areas. The systems can be further extended to difficult and extreme locations on Earth that are currently unused or barely used. This would lessen scarcity of raw materials, further lowering cost of operation. These expansions and upgrades should be done with planning and care to prevent new environmental side-effects.
 Although we describe a progression from easier to harder locations, a given type of location does not have to be completely developed before starting the next category. Rather, their starting points are staggered in order of difficulty, and their development then continues in parallel.
:<u>'''Goal 2 - Benefits from Space'''</u>
 Economic and environmental reasons are enough for building self-improving systems on Earth. Once experience with them is built up, such systems can then be used in a series of locations in space. There are several reasons for this:
* Access to materials on Earth is limited vertically because temperatures and pressure increase with depth.
* Solar energy in nearby space outside the Earth's shadow averages 7 times more than the Earth's surface because there is no night, weather, or atmospheric absorption. Close orbits range from 0 to 40% shade, so still have at least 4.2 times the available energy
* Different and much larger amounts of materials are accessible, which can be used without affecting the Earth's environment.
* There are a variety of risks to civilization on Earth, both natural and self-created. Some of them can be reduced by projects in and expansion into space.
 So our second goal is to make use of space to bring benefits to Earth, and later extend civilization and the biosphere into the space environment.
 Space projects would logically start with easier and nearby locations, then move to farther and more difficult ones in sequence. Developing a new location begins with imports of equipment and starter materials from Earth or previous locations. Core production and resource extraction is built up, then expands to other kinds of industry. Later deliveries of materials, products, and services helps expand operations.
 Remote control is feasible when distances are short, otherwise command-response times can be long. So some people may be needed on-location to set up and maintain equipment. Suitable locations can build up habitats beyond this for other reasons. Once built up enough, an existing location, along with previous ones, can serve as staging points for the next ones, supplying transportation, starter sets, and other items as needed.
 Space locations vary in environment, raw materials, and energy resources. So a trade network among them and the rest of civilization makes sense, just like it does on Earth. Each location takes advantage of local conditions to do what it can do best, and trade with others as needed. Through trade, locations can become economically self-supporting and not a cost sink for society.
:<u>'''Program Advantages'''</u>
 Our new approach has a number of advantages:
* It addresses the frequent criticism of space programs that there are problems here on Earth that need solving. So we place solving economic and environmental problems first, ahead of large space projects.
* Self-improving and highly automated production lowers the cost of rocket factories and launch sites on Earth. It also lowers how much you need to launch by using local resources already in space. The combined result is much cheaper space projects. Activities that are currently uneconomic can become viable.
* In terms of science and exploration, access to the whole Solar System is better than just the Moon and Mars, as interesting as they may be. Locations develop their local resources, so they can sustain long-term operations, rather than being limited to short term missions and single landing sites.
* A continuing development program much safer than isolated missions. A network of many locations can keep backup supplies and equipment available, and they can be delivered more quickly. Automated and remote controlled transports can deliver supplies and equipment before the first people arrive, and regularly afterwards, providing a buffer against problems.
* Lower production and transport costs means more robust designs can be used. Current space systems minimize weight to save on launch from Earth. Robust designs will have better safety margins, lowering crew risk. Bulk mined materials, either in raw form or as end products, can provide radiation shielding during long missions. Production capacity at the destination, such as the Martian surface, enables making spare parts and replacement supplies on the spot, bypassing long delivery times from Earth.
==='''3.1 - Program Sequence'''===
 
 Our program concept is organized into a number of phases and smaller individual projects. There are several reasons for this:
* The phases have different scales of operation, or use locations with different operating environments, raw materials, and energy resources. They will need different designs suited to them.
* We intend each phase to economically justify itself, and provide revenue and benefits to support later ones. It would take too much funding for such a large program otherwise.
* New technologies need more development before using them for seed factories, makernets, and various space projects. This will not happen all at once. Splitting up the research and development across phases and projects is more manageable.
* We can lay out a long term program now, but we don't know what new technologies will be invented in the future, or when. Later phases can be identified for guidance and direction, but it makes sense to concentrate on the early ones for now. Details of later phases can be left flexible until their time approaches.
[[File:Phase Starts vs Time.png|thumb|right|768x480px|Figure 3.1-1 - Program Phases vs Time.]]
 In general, phases don't end, but rather build on previous ones and operate in parallel once started (Figure 3.1-1). For example, mature industrial factories will continue to operate once new locations are set up elsewhere. The phases have a logical sequence, where later steps generally depend on earlier ones. We have identified seven main ones numbered 0 to 6, shown in different colors, with a number of sub-phases indicated by an added letter (4A, 4B, 4C, ...).
[[File:Program Phases.png|thumb|right|768x480px|Figure 3.1-2 - Logical sequence of program phases.]]
 Figure 3.1-2 diagrams the logical relationship of phases. It does not show all their relationships, since that would make the diagram too complicated to read. Their general order is from easier to harder, and from local to more distant. Each phase typically involves multiple projects and locations. For example Phase 5B - Mars Surface Locations, would eventually include many projects across the planet. Most locations will evolve across time by expansion and upgrade. The phases are summarized in the next two headings (3.2 and 3.3), and then in more detail in report sections 4 through 9 below.
==='''3.2 - Phases 0 to 3: Earth Locations'''===
 
 Our program in the broadest sense changes the goals from specific destinations, like a mission to Mars, to improving and extending civilization and the biosphere throughout the Solar System and beyond. We start with our own planet first, because there are large and immediate needs here. So the first four phases apply to Earth.
 Much of human civilization is unevenly developed and unsustainable, and the vast majority of people will live here for many decades. Starting on Earth allows getting experience with technologies that will later be used in space. It is easier and less expensive to apply them here first, and they can produce economic benefits to sustain themselves.
 This program would widen participation from national space programs, to the much wider base of all of civilization. Government space programs are only about 0.08% of gross world product, and only part of that is devoted to exploration and science beyond Earth. Being more inclusive increases the available inputs for projects, and makes faster progress in the end. The first four phases are:
: <u>'''Phase 0: Research and Development'''</u> - The first major phase performs necessary research and development (R&D) for production technologies to be used on Earth, later adaptions to space, and ones used only in space. It also develops transport, habitation, and service technologies as needed for the particular conditions of different locations. The R&D work is spread out in time according to which phases, locations, and projects particular designs are needed for. Some later R&D, such as testing hardware in the operating environment, would occur in space. Since a lot of production technology already exists on Earth, the earliest R&D will mainly be selection of what to use and in what order. Modified and completely new tech will be worked on later as needed.
: <u>'''Phase 1: Starter Locations & Network'''</u> - This phase builds the first sets of seed factory equipment and begins the self-improvement process. Phase 1 equipment can start small, such as home and hobby use, which makes it affordable. Individual equipment items or small groups of them can be located at home or shared work spaces. A network of people directly or electronically coordinate their work to make items for each other, build new network nodes, and start to accumulate larger shared items. New locations may start with less than full starter sets, and build up to making internal improvements. Phase 1 locations are typically in developed and populated areas with access to the materials, energy sources, and equipment needed.
: <u>'''Phase 2: Distributed and Industrial Locations'''</u> - One of the ways a seed factory can grow is to use existing equipment to make parts for larger ones. This leads from home and hobby size, to small business, commercial, and industrial scale equipment and locations. At smaller scales it is reasonable to gather the full range of equipment and people in one place, and make a wide range of products. At larger scales, the equipment and their operators tend to become more distributed and specialized, and serve larger markets. But they can still coordinate on projects and products.
: <u>'''Phase 3: Difficult and Extreme Locations'''</u> - This phase begins extending life and civilization to the parts of the Earth where there is very little or none today. They are unoccupied partly because the environment conditions are more difficult. Self-improving production allows operating affordably in such places. New systems would be set up and grow serially from moderate to difficult and more extreme environments. Technologies like automation and remote control allows machines to operate where it is not feasible for people to stay.
: A major direction for expansion is vertically, to access additional resources and physical space. This goes beyond the fairly thin current layer of activity near the Earth's surface. We can expand the total active area by 7.4 times, but height can be increased hundreds or thousands of meters both up and down. This enables many times more usable volume and materials.
==='''3.3 - Phases 4-6: Space Locations'''===
 
 The later parts of our program involve developing and using space to benefit Earth. It would be based on experience gained in the earlier phases with self-improving systems, which can make more such systems. It is also based on the larger production capacity developed in Phases 2 and 3. This capacity enables building transport systems like rocket factories and launch sites, and plus equipment and starter sets to be used at the new locations. The experience in working in remote and hostile environments in Phase 3 can also be applied to the remote and hostile environments of space.
 At a civilization level this accesses the much larger physical volume, energy, and material resources beyond Earth. Some heavy industry can eventually be moved to space locations, protecting the Earth's environment. It can also decrease societal risks by, for example, diverting hazardous asteroids, or filter parts of the solar spectrum to reduce overheating the planet.
 As in the earlier phases, we propose a step-by-step approach: extracting local resources, building up core production, diversifying industries, then sending starter sets to the next locations. Locations become physically and economically self-supporting, allowing moving forward to new ones. The three later main phases are:
: <u>'''Phase 4: Orbital Locations'''</u> - Locations in this phase share being in orbit around Earth, or in open space between large bodies. This is in contrast to the the surface or closely bound bound orbits around those bodies. The sub-phases progress from lower to higher Earth orbits, then in distance from the Sun from closer to more distant.
: The main local raw materials are from asteroids and other small bodies, but we can import additional material from Earth, the Moon, and other places. We can also mine a limited amount of the Earth's upper atmosphere and the "debris belt" of discarded space hardware. Solar energy is abundantly available in the open spaces near the Sun, but other solutions become more important in the farther areas. The limit to this phase is the farthest orbits bound to the Sun.
: <u>'''Phase 5: Planetary System Locations'''</u> - These locations are orbits tied by gravity to the Moon, major planets, and their larger moons, or on their respective surfaces. The sub-phases are by distance starting with the Moon, then to the inner and outer planets. Although orbital and planetary locations share features like vacuum or atmospheres we can't breath, they differ in having significant gravity wells or surface gravity, and in having night or time in shadow from the Sun. These differences require different designs, so we place them in a separate phase. Mars is part of this phase, but compared to current space programs it has long-term and larger scale exploration and development, rather than a few short missions to specific spots.
: <u>'''Phase 6: Interstellar Locations'''</u> - The last major phase of extending life and civilization includes the space between stars and locations bound to other stars. This is mostly speculative right now because it is far away in time. A lot new technology will likely be needed, and what will already be developed by then is unknown. But we see no reason to stop just because the edge of our Solar System is reached. For now, technical feasibility limits how far projects can go. But that may change in the future, so we include this final phase as a place-holder, and to provide a direction to plan for.
 
=='''4.0 - Seed Factory Technology'''==
 
 Our program leans heavily on the idea of "seed factories", which are self-improving production systems which grow from starter sets. We note some details in this section, but more on the subject can be found in '''[https://en.wikibooks.org/wiki/Seed_Factories Volume I]''', and in information about '''[https://en.wikibooks.org/wiki/User:Danielravennest/SFP Our Project]''', which is attempting to develop the technology.
 '''Tools and Growth''' - Our ancestors used tools to make more tools at least as far back as the Paleolithic, 2.6 million years ago, when '''[https://en.wikipedia.org/wiki/Hammerstone Hammerstones]''' were used to flake other stones to produce an assortment of tools. Locally found objects like rocks and sticks were likely used even earlier, but left no identifiable evidence. In modern times we use metal-cutting '''[https://en.wikipedia.org/wiki/Machine_tool Machine Tools]''' to make parts for more machine tools, plus all the other kinds of machines used to make other products.
 Any collection of tools and machines can be used the conventional way to provide products and services to others. The income can then be used to buy new equipment. What is new about seed factories is using starter sets purposely designed to make parts for more tools and equipment to improve the set. A starter set can produce its own energy and extract raw materials, or rely on outside supplies to operate. Once set up, the starter set can improve itself internally in several ways:
* <u>Replication</u> - making copies of existing parts and equipment,
* <u>Diversification</u> - making parts for new equipment not in the current set,
* <u>Quality</u> - making items stronger, more accurate, or from different materials, and
* <u>Scaling</u> - making different size parts (usually larger) than the current ones.
 A relatively small starter set can then grow to produce a wide range and large quantity of products. This can optionally include parts for new starter sets. A starter set may not be able to copy most of its original parts at first, because it lacks the right equipment. But after following a planned series of upgrades it can gain the ability to reproduce all or most of the original set. Biological plant seeds follow a similar growth cycle to make more seeds, which is why we call the starter sets "seed factories". Biological plants can even be part of a starter set, such as using trees to provide lumber and also grow more trees.
 The seed factory approach substitutes information, like plans and instructions, for some part of a mature and more capable factory. On Earth this reduces the cost to get started. For space projects it reduces the starting weight and size, making delivery to distant places easier. With modern technology, the information can be stored and transmitted efficiently, and '''Smart Tools''' (software, robots, etc.) can do much of the work. However, growing from a starter set will take more time than immediately building a finished factory.
:'''Self-Replication and Distributed Production'''
 A seed factory is not the same as a '''[https://en.wikipedia.org/wiki/Self-replicating_machine Self-Replicating Machine]'''. First, a number of different materials and production processes are needed to make modern equipment. These are best carried out by separate tools and machines designed for each task. For large-scale production the set of equipment will be closer to commercial building size, and better described as a factory than a single machine.
 Second, a starter set can be much smaller and simpler than the mature factory. We think of it as the seed from which a factory grows. But a plant seed is not the same as the mature plant, so this is not direct replication in the sense of making an exact copy. If a mature factory can produce new starter sets, it is indirect replication by a cycle of growth and then making copies. This is more like plants and animals reproducing by way of smaller and simpler offspring.
 Third, starter sets and the mature factories are not generally able to make everything they need by themselves. At first they will lack all the right equipment. Even when mature there will likely be items too hard to make, or the materials too rare locally. Those need to be supplied from elsewhere. Since they cannot do it all by themselves, they are not fully self-replicating.
 Traditional factories and workshops had to bring the equipment and people to one place, because it was the only way to coordinate the work. With modern computers, software, and communications this is no longer required. Equipment in different places can work together, and people can operate them remotely. So a modern view of factory capacity is the ability to make things on a regular basis. The people and equipment may be in one place for efficiency, but they don't have to be - they can be partly or entirely distributed. What's important is they can work together to make desired products.
:'''Operations and Functions'''
 Production in general involves a number of processes, which turn can require multiple steps. A seed factory may not be able to do all of them at the start, but they can be added in steps as it upgrades. Process categories include:
* <u>Control of operations</u> - collecting data and sending instructions to the various people and equipment.
* <u>Supply power</u> - this includes electricity, thermal heating, and other sources.
* <u>Extract materials</u> - mining and harvesting raw materials.
* <u>Process materials</u> - converting raw materials to usable inventory.
* <u>Fabricate parts</u> - use inventory stock to produce finished parts.
* <u>Storage and protection</u> - house inventory in various stages of production, plus protect equipment and inventory from local conditions when needed.
* <u>Assemble elements</u> - combine finished parts and materials to produce completed products.
* <u>Grow organics</u> - such as food and timber. These can grow on their own given the right conditions, making it different from other kinds of production.
 Most production flows need materials and energy to work with, in addition to tools and machines. In developed areas these can come from outside sources. In less- or undeveloped areas, this may be difficult. Even in developed areas it may be more economic to self-supply. Production systems can start with or build their own mining and processing equipment for materials. They can also start with or build energy sources, such as wind turbines and solar farms.
 Once operating, production generally uses up supplies like lubricants and drill bits, and needs replacements for parts that wear out. These can either be part of the starter set inventory, or supplied from outside as needed. Over time, a growing system can start to make these items for itself. In order to keep growing and improving, a given system has to make or import items faster than old ones wear out. It also needs enough outside supplies of energy, materials, parts, and other items that it can't make internally.
 We don't expect mature factories to reach 100% self-sufficiency. Some items will likely come from other places, in exchange for surplus products and services supplied to others. We also don't expect fully automated production at current levels of industrial technology. Some people will be needed to use the equipment and do tasks only people can do. Those people can be physically present, or in some cases control operations remotely.
 
 
=='''5.0 - Phase 0: Research and Development (R&D)'''==
 
 The rest of this report provides more detail on our program phases and sub-phases. It does not provide complete plans and hardware designs both for length and because they haven't been defined yet. We also can't claim this is the best possible program. We present it as a ''<u>possible</u>'' path that leverages self-improving production methods. Much more work is needed on this idea, and we invite other people to help. Where next steps have been identified, we note them below, in our two volumes on seed factories and space systems, and our other documents.
 A vast amount of knowledge, technology, skills, and products already exist. Where they do, we can simply select and use them. When new arrangements of existing items, or modified or completely new items are needed, '''[https://en.wikipedia.org/wiki/Research_and_development Research and Development]''' (R&D) is the technical method to create them. It is a set of innovative activities undertaken by groups of individuals, corporations, industrialists, or governments. This program phase is numbered zero because it is preparation needed to make the later phases possible. The R&D sub-phases are numbered according to the later phases the work applies to. So sub-phase 0.1 would be R&D work that applies to Phase 1: Starter Locations.
:'''R&D Goals'''
 Our program needs research and development because we are attempting a new way to organize projects using starter sets and self-improvement. This will likely need some new equipment and processes for particular environments, especially those in space. So the goal of this phase is to supply ready-to-use technology and designs. Since R&D is the first program phase, it can't evolve from previous ones. Instead it must start with existing items like buildings, tools, machines, design methods, and skills.
 Developing new locations is not the main purpose of this phase, like it is for later ones. Places like offices, industrial space, and test areas will be needed for the R&D work, but can start with existing ones. In later phases, testing for unique environments may be easier to do in those environments rather than building simulators. So some later R&D work may move to difficult locations on Earth, or to locations in space.
:'''Production by R&D Phase'''
 Some production will happen in the course of setting up R&D locations, testing new equipment designs, and figuring out the best operating flows. But that is not the main goal. Such outputs can be used later, but they are secondary to the main goal to provide usable designs and processes for later phases to use.
 Some of the newly designed equipment that is built for testing may be kept and used internally afterwards. This would help expand and upgrade the R&D locations themselves, and serve as a demonstration of the self-improvement process. Other finished equipment, products, and services generated during R&D can get sold or traded to fund further R&D work. Feedback from practical use of such items can help improve the designs.
 Final designs should have a long operating life if they are to be useful. So early prototypes should aim for longer lives than the time needed to test them. Prototypes with remaining useful lives can be delivered and used in other locations for later phases and projects. Lastly, the R&D phase may produce some final versions of starter set equipment. These can be used directly in later phases.
:'''Sharing Our Results'''
 We want our work to have the most benefit for the most people. So we plan to eventually open-source the designs, so that anyone can use and improve on them. They may be temporarily kept private to help finance additional R&D. In general individual machines, factories, and the products they produce, would be separately owned, either privately or institutionally.
 The R&D Phase may develop new methods and technology to use for itself in the course of working towards later phase designs. We would also make such new developments available for others to use. An example is full resource accounting, a method to track all the inputs and outputs of a system the way financial accounting tracks money. In order for projects to be functional and sustainable, they should account for everything, including scarce resources and all process wastes. If possible these should be recyclable or usable elsewhere, but you can't do that if you don't identify and track them.
:'''R&D Tasks and Projects'''
 The R&D work is divided up according to the later phases and projects that need it. Items used by multiple phases are assigned to the first one they are needed for. Later phases start at different times. So the R&D work for each one is started far enough ahead that it is ready when needed.
 New designs and technology are likely needed even for the last phase. So we expect R&D work will continue for the whole life of our program. In addition to internal R&D work, we expect technology to make progress outside our program. So part of the R&D phase is staying current with outside developments, so that improved designs and methods can be developed within the program later. New and expanded locations within a phase, and unique conditions found there, may require design updates, new hardware models, and customization. Lastly, we expect feedback from using the items in later phases and suggestions for improvements. All of these are reasons to continue the R&D process.
 The R&D work is logically grouped into smaller projects according to the technologies being developed or type of end use. So far we have started this Seed Factory Project to develop the basic ideas for self-improving systems, and started working on what will be needed for Phase 1 locations and networks.
 Future R&D project examples are ocean mining platforms or interplanetary tugs. Such systems would be used in later phases, so we have not yet identified specific ones. There is a lot of science and technology work happening elsewhere in civilization. We do not expect to duplicate that work, but use their results where it makes sense, and contribute back our own results to the general fund of knowledge.
 
=='''6.0 - Moderate Locations'''==
 
 Once the R&D phase starts providing plans, designs, and technology, the core self-improvement methods stay the same in all later phases. But equipment sets must be adapted to local environments, material and energy resources, and available people and their skills. Finished products and services also need to be adapted for local and export use. So our program concept has multiple later phases to account for all these differences.
 Phases 1 and 2 are for the easiest environment conditions, which we call "Moderate". This includes temperatures, water supply, and a number of others. The ranges we consider moderate are listed in section 7.1 which covers conditions that are more difficult. Moderate ones are the kinds of places where most people currently live. Among them are locations with significant population and physical development, such as around cities. These locations have enough people, supply sources, and transportation to get started. So they are the easiest ones to build the first projects in. The three phases/sub-phases for these areas are mainly distinguished by scale of operation. They are phases 1:Starter, 2A: Distributed, and 2B: Industrial.
==='''6.1 - Phase 1: Starter Locations and Network'''===
 
:'''Goals'''
 The main goals of this phase are (1) provide products and services at the personal and community level, (2) develop experience with starter sets and self-improvement, and (3) develop trade networks among people in local sites and different locations. By site we mean an individual place like a home or commercial building, while a location is at the scale of a city or metropolitan area that travel and transport across is reasonably easy. Network members can trade physical items, labor, information, and other items as needed. They can also coordinate work on larger or more complicated projects, despite being in different places.
 Networks would be used in all later phases. This is because (1) locations vary in the material and energy sources available. (2) Individuals and groups have variable skills and interests. They also may not want to travel too far to work on projects. (3) Physical space, utilities, safety, and local rules may limit the work done at a particular site.
:'''Starting Points'''
 Projects in general need Tools, Resources, Energy, and Knowledge to complete. We call this the "TREK" principle for short. Early projects won't have the benefit of a lot of finished R&D work. To start with they can use already developed tools and machines, existing sources of materials and parts, available electric power and fuels, and the many books, online videos, and other information sources on how to do what is needed.
 Early project examples are (1) setting up for a hobby that needs working space and equipment and (2) improvements to an existing home. Such projects don't have to be completed all at once. They can be started with minimal equipment for the first steps, and gradually add more items as skills accumulate. Eventually an owner can start building custom items like a work table or storage for themselves. If they can find other people interested in similar projects they can share knowledge, trade items, and help each other when extra people are needed. Like other parts of our program, people's skills and the equipment they work with are not intended to reach a static end point, but to grow and develop over time. So self-education, training, and practice are encouraged.
 Equipment for this phase starts at the hobby and home use level, for personal and local community products and services. Their duty cycle (percentage of time in operation) is less than full time, and the equipment is smaller and less expensive. This puts the equipment in reach of ordinary people or small groups. Groups of people can afford a number of these smaller items. They can be housed in space they already have, or they can build or rent space without too much difficulty.
 Equipment may be distributed at people's homes, or grouped into clusters on one property, such as a '''[https://en.wikipedia.org/wiki/Hackerspace Community Workshop]''' or small scale production cooperative. Individual sites may be limited in size and cost, but the network as a whole can grow and improve by adding more sites and upgrading existing ones.
:'''Later Improvements'''
 Improvements can come from new R&D work. personal experience, more copies of existing items, scaling to larger (and sometimes smaller) sizes, and purchases funded from sales. As the network expands and upgrades itself, it can produce more items internally for further upgrades, and more products for network use or to sell. Network production can be logically grouped into (1) tools and machines intended to make more tools and machines, (2) items intended for production but not for making more equipment, such as a sawmill or greenhouse, and (3) finished products to be used, traded, or sold, like furniture and food.
 The R&D phase would gradually develop plans, designs, and instructions for starter sets, upgrade paths, and custom equipment. These would be shared as information, and can start to be provided as physical packaged sets. Later projects can then start self-improving faster. A trading network can grow as more sites in more locations are built.
 Examples of future R&D-developed equipment include a 1x2 meter bridge mill, with replaceable heads and bits so it can perform different tasks, and a 15 kW solar furnace with replaceable focus targets. The furnace can directly heat items in a crucible, or generate steam for an electric generator. Such starter set equipment is designed for flexibility, rather than maximum efficiency and speed. That way a smaller starter set can be used for a variety of tasks at lower cost. Later equipment, built with the help of the starter set, can be dedicated to single tasks with higher efficiency and performance. Starter equipment may be supplied finished and ready to operate, as kits with some level of assembly and supplies needed, or purely as plans and instructions.
==='''6.2 - Phase 2A: Distributed Locations'''===
 
:'''Goals'''
 The goals of this phase are (1) increased scale of sites and locations, and (2) relief from job insecurity and displacement by automation.
:'''Evolution'''
 Phase 1 locations in general would accumulate skills and equipment. Some sites within the location will move beyond hobby and home use, towards more regular small business and commercial activity. This involves part or full time operation, and selling more products outside the self-improvement network. The larger scale and more intense uses will need different equipment sets.
 When running a business, speed and efficiency become more important, so equipment is chosen or built to do particular tasks well. This results in a larger collection of more specialized equipment. Skills and training also become more specialized and take longer to learn. Particular sites will tend to do a few things well, and trade for other things they need. A comprehensive large site (general purpose workshop or factory) that does many kinds of work is still possible in this phase, but less common. So working sites will tend to be distributed in multiple places.
 Business and commercial scale operation is not limited to production only, but can also serve the full range of habitation, transport, and service industries. For example, a restaurant is a service business, but it needs a building, furniture, and kitchen equipment first. So the logical progression is from core equipment to make more equipment, then finished products like building materials and furniture, and finally industries that don't produce items, but use them to operate.
:'''Ownership'''
 In the current economic system, separation of ownership and labor results in the problem of job insecurity. The owners of a for-profit business have the incentive to remove workers as soon as possible to save on labor costs. The removal may be due to lower production and sales, or changes in business methods and technology that need less labor or different skills.
 When a person or group has built and expanded their own equipment and business, the owners and workers are the same people. They don't have the same incentive to remove themselves. To the extent they make items for their own use, production would remain constant. If outside sales decrease, they own the equipment to build and start doing something else to make up the difference. Automation is a threat to conventional jobs by needing less labor. But owners who use the same automation for themselves are not threatened with unemployment. Rather they just work less time or more efficiently.
 By diversifying into different industries, self-owned production can integrate with the rest of civilization and be self-supporting. New network members can become owners by first building or buying into a share of core production. They can then use that production to make or trade for what's needed in other industries. Alternately they can start out working for others in their chosen industry, and buy or trade for production shares. Either way they have more security as owners.
==='''6.3 - Phase 2B: Industrial Locations'''===
 
:'''Goals'''
 The main goal of this phase is to reach the most efficient production levels by additional growth in scale and specialization. Industrial locations are in the same kind of developed areas and moderate environments as Phase 2A Distributed Locations, so we group them together under Phase 2.
:'''Growth and Specialization'''
 Industrial sites can evolve from distributed small business or commercial sites by continuing self-improvement and growth. They can also be built as new sites of the final size, where the equipment is supplied by other parts of the network. In that case, supplying the larger equipment and space to house them will likely need outside capital, because individuals or a small group typically won't have enough funds. Gradual evolution from a smaller size by self-production would not require as much, or any, outside funding.
 Larger work spaces with larger input and output flows will tend to limit industrial locations to fewer products. For example, if you are processing scrap metal on an industrial scale into new metal stock, it helps to be near a rail line to transport the scrap and the finished metal. The more products, factory space, and specialized needs you have, the less likely you will find one big site that can satisfy all of them.
 The larger production scale means more outside customers for the products, or larger scale customers. The market area for a site will likely reach beyond a single location, to a region or even world-wide. Since outputs are sold to a wide range of customers at greater distances, transport capacity becomes more important in this phase.
 A narrow product range and large scale markets means demand can be more variable from general economic circumstances or competition. Distributed finance and ownership makes sense in this case. Demand may be low for a particular product, but may be high for something else. In a distributed portfolio these tend to average out. Owners can then reassign their labor and equipment as needed to meet the higher demand products.
 The overall production network has a high capacity to recycle and self-produce what it needs. So modifying equipment to meet changing needs is easier to do. This is a somewhat different business model than investors and workers, with managers in between. It more a network of active owner-operators who can change the mix of what they own and what they produce as needed.
 Like distributed locations, industrial ones can serve the full range of industry types. A combination of industrial, distributed, and individual scale industries can meet most of the needs that people have. If they own their own equipment, or shares in them, because they collectively built and grew them themselves, those needs are met securely, despite higher levels of automation.
=='''7.0 - Other Earth Locations'''==
 
:'''Goal'''
 The main goal of this phase is a better quality of life through sustainable development. The Earth's population is growing, and most people want a better lifestyle. This needs more physical resources and energy. But the Earth is already being stressed by human impact on the environment, and future growth will only increase the stress.
:'''Method'''
 One way out of this dilemma is to produce abundant renewable energy with self-improving systems. These systems make more of themselves exponentially, including more power sources. Renewable energy will have much less impact on the planet's heat balance. Large amounts of energy allow increased reprocessing of wastes, and extraction from lower grade ores or even common rock and ocean water. Rapid expansion brings material goods to the rest of the world faster. Self-production and automation lowers the relative costs of products, energy, and materials.
:'''New Locations'''
 Increased supply of raw materials and energy will likely need access to more difficult and remote locations. So Phase 3 covers working in areas that are thinly or completely uninhabited, or that have difficult or extreme local environments. New designs and processes will be needed for such areas. So a new program phase with added R&D is started.
 Harder conditions are a matter of degree, rather than absolutes with a clear dividing line. Sections 7.1 and 7.2 list the ones we have identified. We define the "normal" (moderate) range as those where the middle 90% of of people live. Difficult and extreme conditions are then significantly above or below the moderate range.
 If at least one of the eleven parameters is well beyond the moderate range, then the location is assigned to the difficult category. Extreme locations are even farther from moderate, and can be hostile to people living and working there. More remote-control and automated operations will tend to be used, instead of trying to build controlled environments for people.
 We want to preserve the Earth's total environment, and the parts that are still in a natural state. So developing the difficult and extreme locations must consider sustainability, renewable energy, and environmental impact. An example would be building offshore fisheries to replace wild fish catches. The latter are putting a strain on the ocean food chain, so it is desirable to minimize that impact. But the fisheries must consider all their inputs and outputs in a total system approach to avoid unintended side-effects.
 The mechanics of building in these locations is somewhat different than previous phases. These areas are less populated, with fewer supply sources and utilities available. So growing from a minimal set of tools and machines is harder to do. Instead, more finished equipment is sent from previous locations to start basic functions like mining and producing energy. A set of production equipment then uses these resources, plus some level of imported supplies, to increase capacity.
 That capacity then supplies products and services for local use. Surplus output is traded with the rest of civilization to make the locations self-supporting economically. Once built up, a location can also contribute to starting additional ones. The experience gained in working in difficult or extreme conditions, working remotely, and building up resource extraction and production in such places will be useful for later phases beyond Earth.
==='''7.1 - Phase 3A: Difficult Earth Locations'''===
 
 We define moderate conditions as those where the middle 90% of the Earth's population lives, with 5% at the upper or lower ends for a given parameter. This definition is somewhat arbitrary, but we think reasonable from a design standpoint. The "Difficult" environments are then those that are at least 10% beyond the moderate range in at least one parameter. 10% is measured either linearly or as a logarithmic factor, depending how wide the normal range is. The parameters and moderate and difficult ranges are:
 '''Temperature''' - This is measured by winter average daily lows and summer average daily highs. The moderate range is 260-310K (-13 to 37C). A given location is likely to exceed either the high or low limit, but not both. The difficult range is therefore below 255K (-18C) or above 315K (42C). Examples of difficult temperatures include Chelyabinsk, Russia, where average winter lows are -19C, and Death Valley, California, where summer highs are up to 47C. The lower limit ie more likely to be reached at high altitudes and latitudes. The high limit is more likely to be reached deep underground, because the Earth's internal temperature rises 25 Kelvin/Celsius on average per kilometer of depth.
 '''Water Supply''' - This is measured by fresh water supply in meters or tons/m^2 per year from rain, rivers, snow, ice, moisture condensation and freshwater aquifers. Salty surface water and aquifers are not included, as they aren't drinkable without desalination. Aquifers are limited to natural replenishment rates, as they are not sustainable if drawn from faster. The moderate range is 0.25 to 2.5 meters/year. Since this is a large range, we use a logarithmic scale, and define difficult as 26% below or above the moderate limits, or <0.185 and >3.15 meters/year. The world's drier deserts fall below the 18.5 cm rainfall level, and places like the east coast of Nicaragua exceed the 315 cm upper limit on rainfall. Too much water is difficult because it can cause problems like flooding, erosion, and decay.
 '''Atmosphere Pressure''' - This is measured by average local air pressure in kiloPascals (kPa). For reference, standard sea-level pressure is 101.325 kPa (14.696 psi). The moderate range is assumed to be from 80-100 kPa (near sea-level to 2000 meters altitude) Difficult pressures are below 70kPa (2750 meters altitude) or above 110 kPa (750 meters below sea-level). These correspond to high mountains or plateaus, and deep underground at low altitudes, since the lowest surface elevation is -413 meters. Low pressures and rapid changes in pressure can cause medical problems for people, so pressure-control is needed where people are. Effects on equipment are mostly minor in this range.
 '''Ground Pressure''' - This is the ground/soil strength at the surface, or surrounding water or rock pressure below the surface, in MegaPascals (MPa). These affect the design of structures, and values that are too low or too high become difficult. For reference, average household floors are designed for 0.275 MPa loads. The moderate range is 0.25 to 2.0 MPa. Difficult conditions are then below 0.19 MPa or above 2.5 MPa. The high limit is reached at ocean depths of 250 meters, and underground at depths of 100 meters in average rock. High surrounding pressures require closed containers to lower them for people, or support structures to prevent collapse. The low limit is reached in open waters (zero strength), fine sand or moist clay (low strengths). Low ground strength requires larger building foundations, or floating construction in the case of open waters
 '''Energy Supply''' - This is measured by average energy supply from renewable natural sources in W/m^2. Wind and solar are available in most places, and are rapidly renewable. Ocean thermal and geothermal are widely available if you go deep enough, but take long periods to renew once depleted, so we only count their renewal rate, not the stored energy. Sources like hydroelectric or tidal energy are not available everywhere, but counted if they are.
 Fossil fuels are not sustainable because of finite supply and the waste products they produce. Biofuels may be produced sustainably. Fuels for nuclear fission and fusion (which is still being developed) are in large enough supply to be considered sustainable but require mining or separation. They can be used to produce energy, but we don't count their contribution to local supply.
 Low energy supply is difficult because some is needed for almost every kind of human activity. If it is not available locally, it must be imported by methods like fuel delivery or power lines. High levels of energy supply are not considered difficult. The range of energy flux is roughly 150 to 900 W/m^2 on Earth, so a difficult low value is 125 W/m^2. Any significant depth below the surface is cut off from wind and solar sources, so are likely to be difficult and require energy supplied from elsewhere.
 '''Gravity Level''' - This is mainly one of the conditions for space environments. On and near the Earth's surface it does not vary by more than 10% unless you are in a centrifuge or accelerating vehicle, so there are no natural places on Earth beyond moderate conditions. Low gravity causes biological problems for people, and may for animals and plants. High gravity is difficult to work in for people, and requires extra structural support for physical items.
 '''Radiation Dose''' - This is measured by unprotected background radiation in milliSeivert (mSv)/year. Industrial exposure, such as to medical imaging staff, or from mining, using, and disposing of radioactive materials, is not considered an environment condition. But such exposure needs its own designs for safety and shielding. Natural background radiation varies by location, according to altitude, magnetic field, and what materials are in the ground below. In most places on Earth it varies from 1 to 13 mSv/year.
 A few places have high radiation levels from concentrations of radioactive elements and their decay products, up to 135 mSv/yr. People have lived in such locations for many generations, with no apparent ill effects. Since adaption may have occurred for long-term residents, we will be conservative and consider high radiation levels a hazard to the general population.
 Levels above 17 mSv/year would be considered difficult. Depending on sources, they might require shielding, sealing, or air circulation. Low radiation levels are not considered hazardous, so background levels below 1 mSv/year are not considered difficult. Note that the human body contains some radioactive elements naturally, so there is no zero background level. Even the highest natural radiation levels on Earth are not significant for most equipment designs.
 '''Ping Time''' - This is the round-trip communication delay to the next nearest 5% of world population, in milliseconds (ms). Long delays create difficulty in voice communications or real-time remote control, and slow down any computer network-based activity. There is no lower limit for this parameter, since short ping times are not a difficult condition.
 On or near the Earth's surface we consider ping times above 100 milliseconds to be difficult, as this much delay starts to be noticeable to people. There are few locations that have such high values to reach 5% of the world's people. The 5% value is because you can choose to do tasks like remote control from reasonably nearby, and not from the farthest place on Earth. This parameter becomes more important in space. The speed of light limits operations to within 15,000 km to stay under 100 ms. That only reaches moderately high Earth orbit, and most of space is far beyond that distance.
 '''Travel Time''' - This is the maximum one-way normal travel time for people, to reach the nearest 5% of other people. Travel time for cargo is assumed to be proportional to that for people. High travel times makes it more difficult and expensive to bring in people with special skills, or necessary parts and materials. Densely populated areas can usually be reached in 5 hours or less. Most of the world's populated areas can be reached within 48 hours, so we set this as the upper limit for moderate (developed) travel. The worst case travel time is 10-20 days for parts of Tibet which lack roads, and ocean locations distant from any airports, requiring ship travel to reach. Very low travel times are not a difficulty, so we set no lower limit for this parameter. We define difficult travel as needing more than 2.5 days.
 '''Stay Time''' - This is the average stay time per person per location, in years. People stay in the same location if they live and sleep there the majority of the time, and make trips to other locations less than half the time. Short stay times are more difficult because of increased transportation needs and staff turnover. The short times may be caused by a harsh environment, lack of habitation and services, or the location is simply undesirable. It can also be caused by a rapidly growing population lowering the average residence time. In that case, the difficulty is caused by having to rapidly build new habitation and services.
 Long stay times are not considered difficult, and their upper limit is the human lifespan. Rapidly growing areas provide the shortest average times on Earth, 7 years if normal turnover is added to growth. Since the upper bound is ~70 years, we will set the difficult limit at 25% below the shortest average, at 5 years. Examples where such low values occur are mining and construction camps in remote locations.
 '''Transport Energy''' - This is the total energy to reach a location from the nearest 5% of population, by the most efficient method, in MegaJoules per kilogram (MJ/kg). For reference, 3.6 MJ = 1 kiloWatt-hour of electricity. Transport energy includes kinetic, potential, and frictional energy. High transport energy is difficult because of increased need for equipment, and their higher cost of operation.
 On Earth, potential and kinetic energy of transport are generally low, and friction dominates. Rail and water transport are currently the most efficient bulk methods, and range from 0.225 to 2.25 MJ/kg between densely and sparsely populated areas. Low transport energy is not considered difficult, but we set values above 2.85 MJ/kg to be. Such values can occur when rail and water transport are not available, and part of the trip must be by less efficient methods. It can also happen when there is a lot of altitude change on the route, increasing frictional losses so as not to exceed speed limits.
 Some of these parameters change with time, due to technology and development. For example, parts of Alaska had long travel times when the only available transport was by dog sled. Once small airplanes and a network of landing fields were available, it became less difficult. It may be a specific goal to upgrade a location to less difficult status, but we define it for phases and R&D by the pre-existing conditions that have to be dealt with.
==='''7.2 - Phase 3B: Extreme Earth Locations'''===
 
 We define extreme locations as an additional 10% beyond the difficult range. This is again in linear or logarithmic amounts, depending on the span of moderate conditions most people live in. The more extreme parameters will need further design modifications, and therefore supporting R&D to develop them. We define no upper bound on how extreme things can get, they are only limited by the natural environment and general state of civilization. The parameter values are:
 '''Temperature''' - average daily lows below 250K (-23C) or average daily highs above 320K (47C). The lows might be found in Antarctica or at high altitudes. The highs are found deep underground or in the hottest deserts.
 '''Water Supply''' - The lower range is less than 0.12 meters/year (4.75 inches), which is a very dry desert. The upper range is more than 3.8 meters/year, which is found in the wettest rain forests.
 '''Atmosphere Pressure''' - The extreme ranges are below 60 kPa or above 120 kPa, which correspond to altitudes above about 5500 meters or below -1600 meters. These correspond to very high mountain tops and deep underground.
 '''Ground Pressure''' - The ranges are below 0.12 MPa or above 3 MPa. These correspond to soft clay or open water at the low end, and depths of 300 meters in water and 120 meters in rock.
 '''Energy Supply''' - The low range is below 90 W/m^2 from wind and solar, which is mainly encountered below the surface. High values of energy supply are not a difficulty.
 '''Gravity Level''' - This parameter does not vary by more than a few percent on Earth, so extreme conditions more than 20% beyond normal do not occur.
 '''Radiation Dose''' - The extreme range is more than 21 mSV/year, which occurs in some natural high radiation areas, or if spending a lot of time (>25%) at high altitude near the magnetic poles, where cosmic radiation can come down vertically.
 '''Ping Time''' - The range for extreme ping time is more than 125 ms round trip. This is nearly around the world at the speed of light, so accessing 5% of the population only takes this long if radio or fiber communications routes are very indirect or unavailable.
 '''Travel Time''' - The range for extreme travel time is more than 3 days to reach. This is found only in very remote areas without conventional transportation.
 '''Stay Time''' - The lower range is average stay times below 3 years 4 months, which mainly would be found in temporary work locations.
 '''Transport Energy''' - The upper range for extreme transport energy is above 3.5 MJ/kg. This is reached mainly when inefficient transportation has to be used.
=='''8.0 - Phase 4: Orbital Locations'''==
 
[[File:Von_Braun_1952_Space_Station_Concept_9132079_original.jpg|thumb|right|640x446px|Figure 8.0-1 - 1952 space station concept by Wernher von Braun and Chesley Bonestell.]]
:'''Goals'''
 The main goals of phases 4 through 6 are using space to bring benefits to Earth, and to help with some long-term problems and risks that can't be handled any other way.
 Figure 8.0-1 is an early concept for a rotating '''[https://en.wikipedia.org/wiki/Space_station Space Station]''', made 5 years before the first orbital launch of Sputnik 1. Note the ring-shaped solar collector on top. This would heat a fluid to produce power, since the first practical silicon solar cell would not be made until 2 years later. We show this concept as a reminder that plans can only be made from what is known at the time. Our approach to developing space may look equally out of date 75 years in the future. Despite that, we have to start somewhere and then make updates as needed.
:'''Approach'''
 This section (8.0) 9.0, and 10.0 cover Phases 4, 5, and 6 in that order. Sub-phases for each are grouped together because they involve working in similar space environments. We expect the various sub-phases to have different starting times due to relative difficulty in reaching their locations and distance from Earth. But once started the sub-phases would overlap and continue in parallel.
 Orbital locations (Phase 4) come first, because Earth orbit has to be reached before going anywhere else in space. Planetary system locations (Phase 5) come next. They share being on or tied by gravity to the larger Solar System bodies other than Earth. Their gravity wells take more work to travel to and from than orbital locations in similar solar orbits. The local environments are also different on and around these bodies. Phase 6 (Interstellar Locations) involves places beyond the Sun's gravitational dominance. It is expected to be last in time. It is hard to predict what technology will be available by then, and how such distant locations would be used. So the last phase is mainly included as a placeholder and to provide some direction for future work.
:'''Current and Near-Term Space Industry'''
 Working on long-term problems doesn't have an immediate economic return. So the first uses of our approach for places beyond Earth would be to support existing and near-term space industry. According the '''[https://orbitalradar.com/how-many-satellites-in-orbit Orbital Radar]''' site there were over 18,000 active satellites orbiting the Earth in September 2026. There were also about 10,700 pieces of debris and leftover rocket parts. There are a smaller number of spacecraft and other items that have been sent beyond Earth orbit, some of which are still operating. The inactive equipment, plus other discarded items and fragments, make up artificial '''[https://en.wikipedia.org/wiki/Space_debris Space Debris]'''. The increasing amount of debris is one of the long-term problems that need solving.
 '''[https://sia.org/news-resources/state-of-the-satellite-industry-report/ Total Economic Activity]''' related to space was $429 billion as of 2025, split between government and private projects. But nearly all of the people involved, and most of the physical tasks, happen on Earth. This provides a starting point for using our self-improvement methods and other advanced technology. In turn that should lower costs.
 Reaching space is generally industrial-scale activity. Rockets themselves are large, and so are the places and equipment to build and launch them. So it would be part of or follow Phase 2B's other industrial locations. What is sent to space can be as small as hobby scale. '''[https://en.wikipedia.org/wiki/Amateur_radio_satellite Amateur Radio Operators]''' have sent satellites into orbit, and over 3,000 '''[https://en.wikipedia.org/wiki/CubeSat Cubesats]''' based on 10 cm modular sizes have been sent to space. Building and operating equipment sent to space more typically ranges from Phase 2A's small business and commercial scale up to the industrial level.
 Reaching space was very expensive until recently because some or all of a rocket was discarded after one use. The high cost limited space activity to large nations or groups of them at first. Over time, commercial space activity has grown to be about 75% of the total. Lower cost transportation and satellite equipment is actively being pursued. The methods include adopting mass production, and discarding less or none of the rocket each flight.
 Most equipment sent to space is also discarded when it fails or reaches the end of its useful life. Replacing the equipmwnt adds to the cost of operating in space. Refueling, maintenance, and repair of space hardware is very limited. New production, upgrades, and recycling in space is limited to non-existent. Total cost can be lowered by changing how space projects are built, delivered, and operated. In turn this would expand existing uses, and open up new ones like private space stations and space tourism.
:'''Long-Term Sustainability'''
 As of 2025 fossil fuels supplied 81.9% of global primary energy. Since about 1900 their rapid growth powered most of the development of modern civilization. But that comes with a number of unfortunate side effects. They include environmental damage, pollution, and adding greenhouse gases, mainly CO2, to the atmosphere far faster then natural processes remove it.
 These gases reduce infrared radiation back to space, altering the balance between incoming sunlight and outgoing heat. Venus' surface temperature of 462 C (864 F) shows why this is a bad idea. Only 50C of Venus' higher temperature is due to being closer to the Sun. The rest is primarily heat trapped by a thick CO2 atmosphere. Society must transition this century to renewable non-carbon energy sources, so Earth doesn't become more like the hell that Venus is.
 Despite the large-scale use of fossil and other energy sources, current civilization can't afford to capture and reprocess all waste materials, nor extract new materials from abundant but low-grade sources. New materials come from '''[https://en.wikipedia.org/wiki/Ore Ores]''' instead. These have higher concentrations of desired products, which take less work to extract. However, high-grade ores are in limited supply. If used materials are not fully reprocessed, those ores will eventually run out. So the current state of civilization is unsustainable. It is heading towards severe problems from increasing temperature, running out of affordable materials, or both.
 At the same time, the world's population is growing, and not everyone has the benefits of high income economies. Full development of such economies would demand even more energy and materials. It's unfair to deny these benefits to some people because others were the first to get them. A growing population with a high standard of living will put more stress on the remaining natural world, and deplete accessible resources faster. Self-improving factories and other advanced technologies can be used to build more renewable energy sources and reprocess more wastes. This would have less impact on Earth, but it would not reduce it to zero.
:'''Civilization-Level Risks'''
 Another problem is preserving civilization and the biosphere in the face of large-scale risks. One such risk is runaway greenhouse warming due to positive feedback loops. This is different than the temperature rising a certain number of degrees from higher CO<sub>2</sub> levels. Melting ice caps can expose darker water or land, increasing the absorbed sunlight and causing further melting. Another feedback loop is release of methane from frozen ocean hydrates and organic matter in permafrost. Methane is a strong greenhouse gas, and so can lead to accelerated release.
 Another risk is from asteroids. Large asteroids fly past Earth fairly frequently, and occasionally hit it, causing widespread damage. There are enough craters, recorded impacts, and near misses to know it is a low probability event, but can be catastrophic if it does. So it is worth trying to reduce that risk. Note that small objects either burn up in the atmosphere or only cause local damage, and don't require civilization-level action to prevent.
 There are other large-scale risks besides these two. Examples include '''[https://en.wikipedia.org/wiki/Supervolcano Supervolcano]''' eruptions, genetically engineered plagues, and nuclear war. It is worth some effort to identify these risks, and reduce them if possible. Backup locations beyond Earth can be a last resort if such efforts fail, but most efforts should likely be directed at prevention rather than recovery.
==='''8.1 - Using Space to Solve Earth's Problems'''===
 
 There are abundant energy and material resources in space. If the cost of using them can be brought low enough, then that becomes preferable to, for example, putting more solar panels in climates unsuited to them, or digging ever deeper underground to find high quality ores.
 There is seven times more solar energy available in space near the Earth than the average on the ground. Atmospheric absorption, night, and weather account for the difference. The equipment to collect that energy is also about seven times lighter because it doesn't need to handle gravity and weather. So the energy output to equipment mass ratio is roughly 50 times higher.
 There is also a wide variety of accessible materials in space, starting with the Moon's surface and nearby asteroids. These have been "pre-mined" in the sense that impacts have left them broken up and loose. Extracting them doesn't need heavy equipment, so the tons mined per ton of equipment is high. The combination of high energy and low equipment could allow rapid bootstrapping of space industry. The products can then help solve the problems and risks we noted above.
:'''Lowering Space Operations Cost'''
 Reaching and working in space has been very expensive, especially beyond the lowest Earth orbits. But that is an engineering problem, not one set by basic physics. For example, wholesale potatoes are on the order of $300/ton, and the wholesale electrical energy to put those potatoes in Earth orbit (8.7 MWh) is on the order of $550, less than twice as much. Sending even cheap bulk commodities to space would be affordable if done with high efficiency. Current launch costs are quoted at $1.52 million/ton or more (Falcon Heavy, 2022), 2750 times as much. This shows how much room there is for improvement.
 There are a number of ways this cost can be reduced. Reaching space today requires a good deal of equipment on Earth, like rocket factories, the rockets themselves, and launch sites for them. Self-improving automated production can lower the costs of these. As with other industries, you can begin with a starter set, and grow it until you have mature factories that produce the space hardware you need.
 A large amount of rocket and satellite hardware is discarded after use. This is a major contributor to high costs. Improved designs can allow reuse and repair. Conventional rockets are also inefficient. They require about 40 times the payload mass in fuel (for '''[https://en.wikipedia.org/wiki/Rocket_propellant#Current_cryogenic_types LOX/RP-1]''') containing 387 MJ/kg of fuel energy. The payload ends up with 32 MJ/kg of kinetic and potential energy, so the fuel efficiency is only 8.3%. Alternate launch methods can dramatically improve on this value, but there has to be enough traffic to space to justify their development.
 Advanced production methods in space, using materials and energy already there, can ultimately reduce mass launched from Earth by 98-99%. The transportation component of operating in space can then be reduced by a similar ratio. If in-space production costs are less than the launch savings, then overall costs go down.
 More efficient space technologies, like electric propulsion and closed life support, further reduce the mass from Earth needed to operate. The closer we can source supplies to the desired destination, the less effort is needed to move them there. So a Lunar or Mars base would ideally get most of what it needs locally, or from not too far away, and only get from Earth what can't be found or made otherwise. The combination of all these methods would get much closer to "potato cost".
:'''Space Development Process'''
 Our approach would follow the same general path in space as it does on Earth. In particular the methods used for difficult and extreme locations on Earth are relevant, although the details will differ. Space is nearly undeveloped and barely populated. So early tasks include delivering equipment to supply energy and gather raw materials. A core set of processing equipment would be used to turn raw materials into basic supplies like propellants, and production inventory like metal stock.
 Other equipment takes these products, plus some amount of imported items, and fabricates parts for more production equipment, plus finished items like habitats for people and food production. Metals for machinery and construction are likely the majority of first generation production, since that is the foundation of industry on Earth. Second and later generation equipment can then produce other materials and products in an expanding sequence.
 In the early stages there is less equipment available at a given location. So a larger percentage of parts and materials has to be imported from previous places, or from Earth. As more equipment accumulates, a higher percentage can be produced locally. Once a given location has matured enough, it can start to make items for new starter sets. These can be used in the same region, such as other parts of the Moon, or sent off to start developing new regions.
 Once a location can export a surplus of locally made items, they can be traded for those it can't make, or needed materials that are locally rare. Such trade would be based on '''[https://en.wikipedia.org/wiki/Comparative_advantage Comparative Advantage]''' like it is on Earth. By export and trade a location can become economically self-supporting, and not a cost burden. This is in contrast to a station or base that can't make things locally, which has to be supplied from elsewhere at a continuing cost.
 Self-supporting locations can produce an expanding wave of civilization and life as far as people want to carry them - throughout the Solar System, and in the long term, beyond it.
:'''General Space Environment Features'''
 Orbital locations in Phase 4 begin at 200 km altitude above the Earth's surface, where atmospheric density is low enough for stable orbits. They extend beyond that to the limits of stable orbits bound by gravity to Earth, then to interplanetary orbits at all distances from the Sun. The planetary system locations of Phase 5 are embedded within the larger interplanetary region, and move with the major bodies and the gravity fields they produce.
 The environment conditions, raw materials, and available energy vary widely across the different regions. So we divide Phase 4 into six sub-phases by region, and Phase 5 into five sub-phases. We expect their development to start mostly in order by distance from Earth. Orbital locations include smaller bodies like asteroids found there, and planetary systems include an area of stable orbits around them and the smaller bodies tied to them by gravity.
 The environment parameters for Phases 4 and 5 are generally more difficult than extreme ones on Earth (Phase 3B). The added difficulty in many cases is incremental, not orders of magnitude steps, and not in all parameters. Proper design and operation can deal with most of these conditions, but some places are so extreme that current technology has no way to handle them. The general ranges are noted here. Some details for sub-phases and particular locations are noted below. Extensive and growing knowledge about them comes from the field of '''[https://en.wikipedia.org/wiki/Planetary_science Planetary Science]'''.
* '''Temperature''' - Distance from the Sun, and the percent field of view of the '''[https://en.wikipedia.org/wiki/Cosmic_background_radiation Cosmic Background]''', which is at near absolute zero temperature (2.7K) are the main determinants of local temperature. It can range anywhere from above 700K to below 50K (+425 to -225 C). Partly shadowed orbits, or night on a surface, can produce wide temperature swings. Reflection from the surface of a body, or underground surroundings, will modify the ambient temperature.
* '''Water Supply''' - Orbital locations don't have a weather system that delivers a renewable water supply like Earth. But some bodies have water in the form of hydrated minerals or ice. Liquid water layers may exist inside dwarf planets and moons, and water in general is abundant beyond the "frost line" around 3 times Earth's distance from the Sun (3 AU), where temperatures are low enough for ice to be stable in a vacuum.
* '''Atmosphere Pressure''' - Vacuum is the normal condition in open space and on the surface of most bodies. Some of the larger dwarf planets and moons have non-zero pressures, and all the major planets except Mercury have significant to dominant atmospheres.
* '''Ground Pressure''' - This doesn't exist in open space, and is generally low even for larger asteroids, either because of low gravity or low surface strength. Ground pressure can become significant if you go deep enough into larger asteroids. It becomes very high inside large moons and major planets.
* '''Energy Supply''' - Varies from above 10 kW/m<sup>2</sup> in close solar orbits to below 1.5 W/m<sup>2</sup> beyond Neptune. Orbits with time in shadow lose a percentage of this. Surfaces in vacuum reduce solar energy by about 50% from nights, with variations from topography like mountains and craters. Atmospheres can further reduce solar energy.
: Other sources like wind, precipitation, and geothermal may be available on some bodies. Nuclear power is possible using fuel delivered from Earth or mined from places with radioactive elements like the Moon. Power can be transmitted over moderate distances using conductors and beams, or even simple reflectors.
* '''Gravity Level''' - Natural gravity ranges from zero in free orbits, to about 3% of Earth's on dwarf planets, and up to 2.4 times Earth on larger moons and major planets. Artificial gravity can be supplied by rotation where biology or industrial processes need it. Artificial gravity is only limited by structural materials and practical issues like arrival and departure.
* '''Radiation Dose''' - Most orbits and surface regions have high natural levels of radiation from galactic cosmic rays, solar particle events (flares), and '''[https://en.wikipedia.org/wiki/Van_Allen_radiation_belt Radiation Belts]''' like the ones around Earth. Devices like solar panels and electronics are generally less sensitive to radiation than living things, but can still be damaged or temporarily upset.
: Radiation can be lowered to safe levels using bulk mass as shielding, or possibly artificial methods like magnetic fields. Shielding mass in orbital locations can come from asteroids or imported from moons. On substantial bodies their mass provides partial natural shielding, and going underground and arranging local materials can provide the rest. Space transport vehicles can use fuel, water, or other supplies as shielding. Large habitats may get enough shielding from their outer structure, equipment, and storage tanks.
* '''Ping Time''' - Round trip communication time varies greatly from milliseconds in low Earth orbits to hours or even days in the outer Solar System. Essentially all the communication time is due to speed of light delays. On Earth, fiber-optic cables transmit at about 2/3 the speed of light, and follow indirect paths from geography and a spherical planet.
* '''Travel Time''' - This also varies greatly according to orbit region. It can take a few hours to reach low Earth orbit or return from it to the ground, plus some travel time to other population on the Earth's surface. Travel to the outer Solar System using known propulsion systems will take a number of years or even decades.
* '''Stay Time''' - This is currently very short because there are no permanently inhabited locations in orbit. Astronaut crews typically stay about 6 months aboard the International Space Station. With the development of larger, more permanent locations, with artificial gravity, food supplies, etc. the stay times can increase to a number of years.
* '''Transport Energy''' - Much less than 5% of civilization is in space, so transport energy is measured from the Earth's surface to an orbital location. This is a minimum of 33 MJ/kg, set by the physics of reaching low Earth orbit. It is a lot higher using current rockets, because their operating efficiency is low. More distant orbital locations require additional energy to reach, and currently this reduces cargo mass dramatically, producing even higher transport energy/kg.
==='''8.2 - Phase 4A: Low Orbit Locations'''===
 
 Sections 8.2 to 8.7 cover sub-phases 4A to 4F. We limit the a amount of detail to keep the size of this report reasonable, and in some cases is limited by the current state of knowledge about the regions. Each region would be developed using the general approach in Section 8.1, with some methods adapted to local conditions. The start of each successive sub-phase is staggered in time, but a region does not have to be fully developed before starting on the next one. They would develop in parallel once started.
 We suggest some economic uses for these regions, how to reach them, and how to develop them. We don't know enough to say if these are the best or only uses for them, and we certainly don't know what ideas other people will come up with in the future. So consider this report as a starting point for others to improve upon.
:'''Low Orbit Features'''
 Earth orbits form a continuous range from 200 km, the minimum set by atmospheric drag, to the maximum set by Sun's gravity becoming dominant. We divide that range in half by the transport energy required to reach it, at 2700 km average altitude. Conditions are different enough between low and high orbits to get their own sub-phases. Orbits can be elliptical and constantly vary in altitude, so we use the average between the high and low points, which is called the '''[https://en.wikipedia.org/wiki/Semi-major_and_semi-minor_axes Semi-Major Axis]'''.
 Objects in low orbits are in the Earth's shadow about 22-40% of the time, reduceing available energy. The Earth fills a large part of the field of view, which affects thermal balances, and lighting when over the sunlit side. Orbit periods are 2.5 hours or less, so travel time from the Earth's surface is fairly short. Ping time by way of ground stations is under 20 ms, so not difficult. But low orbits have a limited view of the Earth's surface at one time. So multiple ground stations are needed, or communications are relayed by a higher satellite. This can add up to 500 ms to round-trip communications, which is a noticeable delay.
 The Earth's magnetic field traps particles into '''[https://en.wikipedia.org/wiki/Van_Allen_radiation_belt Radiation Belts]''' that begin at low orbits and extend past them to high orbits. Unprotected people and electronics can be damaged by the high radiation levels. So spacecraft have to be designed to withstand radiation, avoid these belts, cross them quickly, have sufficient shielding, or the belts depleted artificially.
 Material resources are relatively scarce in low orbit. They include the upper edge of the Earth's atmosphere, and debris from inactive satellites and rocket stages. The mass of particles in the radiation belts is very small. Other materials have to be imported from Earth or higher locations.
:'''Economic Uses'''
 We would like all regions in space to become economically self-supporting. Earth orbits already are, with 75% of total space activity being commercial. Low orbits are occupied by a large number of active satellites serving the people below. Current uses include Earth observation, such as weather, mapping, and agricultural monitoring. Many satellites are now used for communications relay between points on the surface. Government uses include research, such as the Space Station and Hubble Telescope, and national security.
 Future uses may include tourism, orbital assembly and maintenance, and payload transfer, and refueling for more distant destinations. Further development of low orbits would start with existing markets. It would expand to new ones as transportation costs are reduced and local industry built up. We discuss some options in this section, but it is an area with projects being worked on by many others.
 We don't expect large-scale production and habitats in low orbits, because more materials and energy are available higher up. We do expect low orbits to become transit points, because below the radiation belts is the nearest place to Earth that is reasonably safe and doesn't need constant propulsion to maintain position.
:'''Transport from Earth'''
 Low orbit has few available materials, so most items have to be imported. Rockets and space hardware have existed for decades, but they are still too expensive for many future uses. As noted in section 8.1, self-improving and automated production can help lower the cost of building and running aerospace factories and launch sites.
 Reusing rocket hardware can improve costs substantially, but conventional rockets have low energy efficiency. They are limited by the energy in chemical '''[https://en.wikipedia.org/wiki/Propellant Propellants]''' and the mass of the Earth, neither of which is changing. A shift to different launch technologies can can improve efficiency and cost. But there has to be enough traffic to justify the added R&D cost in the face of existing rocket systems. There are many possible launch technologies. See Part 2 of our volume on '''[https://en.wikibooks.org/wiki/Space_Transport_and_Engineering_Methods Space Systems Engineering]''' for an extensive list. We provide one example here to illustrate the possibilities.
[[File:AEDC_Range-G_Launcher_facility.jpg|thumb|800x599px|Figure 8.2-1 - AEDC Range-G Hypersonic Research Gun (on left, 20cm interior diameter of barrel).]]
 '''Hypersonic Guns''' - Hypervelocity gas guns have been used in research for decades (Figure 8.2-1). They are inexpensive to build compared to most aerospace hardware. This is because they don't have to fly, so can be made of heavy industrial parts, and '''[https://en.wikipedia.org/wiki/Light-gas_gun Light Gas Guns]''' are basically simple devices.
 A larger version of such a gun, on a mountain with the correct slope, can supply 50-70% of orbit velocity for bulk cargo which is not sensitive to high g-forces. These include fuel, water, structural parts, even frozen food. Outdoor barrels measured in km rather than meters lower g-forces and operating pressures. But they are still generally too high for delicate cargo and people. Those would use other kinds of transportation. Industrial factories grown from starter sets could be a low-cost source for the construction equipment to build on the mountain, the high pressure pipe, other parts for the gun, and an energy source to compress and heat the gas for launch.
 Muzzle velocities much higher than ~4 km/s (half of orbit speed) become increasingly less efficient. This is because of limits on expansion rate of the working gas, and increased drag and heating while climbing through the atmosphere. The remaining part of reaching orbit is supplied by an internal rocket engine on the projectile or by other methods. Because the rocket engine only supplies half or less of the velocity, it is many times smaller relative to cargo than conventional rockets.
 The fuel-to-payload energy efficiency is roughly two-thirds, much better than conventional rockets. The gun also uses energy, but it is relatively cheap to operate. It is stationary on the ground, uses inexpensive materials, and can be used many times. The projectiles are rugged and durable, and can also be used many times. Re-entry is much gentler than the initial launch. The operating cost per ton to orbit should therefore be lower than conventional rockets. A gun-type launcher could deliver a large portion of the mass to orbit. There is no requirement that everything going to space has to travel the same way, any more than it does here on Earth.
 '''Other Launch Methods''' - Hypervelocity guns are just one example. Other technologies with reasonable prospects include high-speed air-breathing engines for the early part of flight, and orbiting structures with suborbital landing platforms for the later part. Both are more efficient than chemical rockets in their respective velocity ranges. Unfortunately neither can easily serve the whole job of transport to orbit. A combination of systems, each operating where it works best, is likely the better option.
 High speed jet engines and orbital platforms would require substantial R&D, and are therefore not likely to be the first things built. Instead, lowering the cost of conventional rockets is the first step. It would then be supplemented with a low R&D system like a hypersonic gun. Once new markets are opened up by the lower costs, the more advanced technologies that need more R&D can then make economic sense.
:'''Mining and Production'''
 Low orbits are not ideal places to process raw materials. That requires a lot of energy, and sunlight is blocked a good percentage of the time. But there is enough energy to fabricate parts and assemble them to finished items. For example, spools of high strength fiber and metal wire are rugged enough to be launched by bulk systems. The fiber and wire can be wrapped and plasma-sprayed in layers around inflatable or collapsible forms, to build up large, lightweight structures. Large pressurized volumes built this way can then house other production and assembly equipment and people to work there.
 There are some material resources in low orbit that don't require a lot of processing. At altitudes of around 200 km it may be possible to "scoop mine" the upper atmosphere. A collection scoop funnels incoming air, which is very thin at this altitude, to a vacuum pump and compressor. A portion of the air is expelled by electric engines at much higher velocity than the incoming flow. This makes up for drag from the scoop. The remaining air is stored in tanks.
 When the tanks are full, the mining ship climbs higher and unloads to storage tanks at a depot. The reason to mine like this, rather than launching gases directly from Earth, is the solar arrays that power the mining ship can produce 1000 times the energy needed to put themselves in orbit over their operating life. As long as the gas mining can be done with reasonable efficiency, launching solar arrays rather than tanks of gases results in much more usable product in the end.
 A steady supply of air (or nitrogen and oxygen if separated) obviously can be used to support people in orbit. It can also fuel tugs that collect dead satellites and debris from the Earth's "debris belt". This both reduces the hazard they create, and supplies useful resources. The collected materials can be scavenged for usable parts or recycled into new products. Dead satellites and empty rocket stages are made of aerospace materials, so they should not need a lot of processing to reuse.
 Mining the debris is only feasible with a cheap source of propellant and efficient electric engines. The pieces are in random orbits, and would consume too much propellant to gather otherwise. Air plus debris mining can provide enough materials to support some production in low orbit. The larger sources available from the Moon and asteroids, and the full-time solar energy in higher orbits, leads to the majority of production being done elsewhere. It can be efficiently delivered "downhill" using gentle '''[https://en.wikipedia.org/wiki/Aerobraking Aerobraking]'''. Low orbit mining and production then ends up supporting local uses, and this region functions as a transfer point between the ground and elsewhere.
==='''8.3 - Phase 4B: High Orbit Locations'''===
 
:'''High Orbit Features'''
 We define high orbits as extending from 2700 km average altitude to the limit of the Earth's dominant gravitational influence, or '''[https://en.wikipedia.org/wiki/Hill_sphere Hill Sphere]'''. For Earth this is about 1.5 million km, but towards the outer edges orbits become less stable. This is a large range of distances, but it only represents the upper 25% of energy between the Earth's surface and escape. That's because gravity is an inverse square force and weakens rapidly as you increase distance.
 The Moon is the most prominent feature in high orbit. It has its own area of dominant gravity, with a radius of about 60,000 km, and reasonably stable orbits with semi-major axes to about 35,000 km. Additional energy is needed to descend through the Moon's gravity field to low orbits or the surface. Conditions are also different enough near and on the Moon that we assign the region within 35,000 km to Phase 5A - Lunar Locations.
 High orbits are in sunlight 85-100% of the time, reaching the highest values when farther from the Earth and Moon. Temperature is determined mostly by the Sun and the cold Cosmic Background, but at lower altitudes the Earth contributes a significant amount of reflected light and infrared heat. Orbit periods range from 2.5 hours to 7 months, so travel times by the most efficient routes can be long. Direct paths can be much faster, 12 days or less, at the expense of additional energy.
 Ping time varies from as little as 25 ms, which is not difficult, up to 10 seconds, which has a large impact on voice, real-time control, and electronic data. The upper part of the Earth's radiation belts, solar, and cosmic radiation create high to dangerous levels for people and equipment. Energy resources are abundant in this region, but material resources are low in their natural state. The Moon and Near Earth Objects can supply materials with fairly low transport energies.
:'''Economic Uses'''
 One orbit in this region, geosynchronous, at 35,000 km altitude, is already heavily used. This orbit has a period of 24 hours, which matches the Earth's rotation. So satellites appear to stay above a fixed ground location, and ground antennas can be stationary rather than having to track satellite motion. Synchronous orbit is in the outer fringe of the radiation belts.
 Future production and human habitation would likely start higher up. One set of such locations are near the Earth-Moon L4 and L5 '''[https://en.wikipedia.org/wiki/Lagrange_point Lagrange Points]'''. These are stable regions, but not singular points. The Sun's gravity and the Moon's orbit not being circular or in the same plane as the Earth and Sun cause some motion around the points.
 Delivery, refueling, and maintenance of high orbit satellites from Earth are current and near-term activities for this region. Future activity can include supplying fuel and other supplies from space sources back to low orbit and to early interplanetary locations. These and other possible future activities depend on bringing costs down to affordable levels. This would happen incrementally as self-improving production for early markets bootstraps to larger levels.
 There are some civilization-level problems that high orbit activity can help with. If climate change solutions on Earth are not enough, orbiting sun filters can be used. They let wavelengths used by plants through, but block other parts of the solar spectrum. This would help cool the planet. Large solar system objects that pose a risk to Earth could be diverted or put to use instead. This requires finding them far enough in advance to change their orbit. An active civilization and biosphere off-planet could restore Earth if catastrophes happen despite our best efforts.
 The solar energy flowing through this region is nearly 500 million times what civilization uses today. The Moon and nearby asteroids can supply 250 million years of raw materials at Earth's current mining rate without recycling. With abundant energy and recycling a small fraction of these resources can make civilization sustainable for a very long time.
:'''Transport from Other Orbits'''
 Excluding the Moon, the high orbit region is nearly devoid of raw materials. So they must be imported from elsewhere. Current transport from Earth uses a rocket to reach orbit, then more chemical or electric propulsion to reach higher orbits. Electric propulsion is about ten times more fuel-efficient than chemical rockets, and is being used more in recent years.
 Electric engines need large amounts of power to operate, but efficient and lightweight solar panels have been developed in the last few decades (see '''[https://www.nrel.gov/pv/cell-efficiency.html NREL Efficiency Chart]'''). The engines are low thrust, which would expose people and some other items to too much radiation while crossing the Van Allen belts. So some early transport will use less efficient but faster rockets. Once propellants and bulk mass for shielding are available from space sources, the penalty for less efficient transport can be reduced.
 Bulk materials mined from NEOs (Section 2.1) are not time- or radiation-sensitive. They can be transported entirely by electric engines on tugs that make multiple trips. Since part of the product from these objects is more fuel for the tugs, the transport becomes self-sustaining once started. A tug can return about 750 times its hardware mass over a 15 year working life, while consuming about 17 times its mass in propellant over the same period. Tugs can also efficiently deliver hardware and finished products to other orbits as needed.
 The Moon is small enough that bulk materials can be thrown directly into orbit by electric catapults. Assuming 50% efficiency and 50% duty cycle from lunar night, a solar panel can power throwing 1000 times its own mass per year for a 15 year operating life. If the catapult is not too heavy relative to the total mass it can throw, the overall mass return ratio is high. From low Lunar orbit, electric tugs take over and deliver the materials for processing. There are about five major "ore types" of different compositions on the Moon and NEOs: highlands, maria, carbonaceous, stony, and metallic. Using all of them would supply the widest range of raw materials to make the widest range of products.
:'''High Orbit Production'''
 Energy is needed to convert raw materials into finished products. High orbits have abundant '''[https://en.wikipedia.org/wiki/Solar_constant Solar Energy]''', up to 11,930 kWh/m<sup>2</sup>/year. It can be converted to electricity by solar panels or used directly for heating using concentrating reflectors. Modern space solar panels and reflectors are very light weight relative to their power output, since they don't have to withstand gravity or weather. Excess heat can be disposed of by radiators or natural '''[https://en.wikipedia.org/wiki/Radiant_exitance Emittance]'''. Low temperatures can be reached with '''[https://en.wikipedia.org/wiki/Space_sunshade Thermal Shades]''' to block the Sun and other heat sources, and active refrigeration if needed.
 A set of solar panels can supply enough power to start production, since electric power has many uses. Early processing, fabrication, and assembly equipment would come from Earth or low orbit. The first set of products are simple items to be used directly, such as shielding mass, fuel, and basic construction materials. The early production equipment would be supplemented over time by items made in orbit. Over time high orbit industry would transition from importing everything, to making items locally, then exporting products to other destinations.
 Given sources of raw materials and energy, the simplest product of all is radiation shielding for people and equipment. This only requires crushing and sorting, then packing into containers around areas that need protection. Shielding also acts as thermal insulation and impact protection. Shielded modules allow extended crew stays in high orbit. Crews can operate production equipment and perform economic tasks for others, like satellite maintenance and refueling. To some extent the crew can be helped by remote control from Earth.
 Next in difficulty, but not necessarily in priority, are water and carbon compounds, extracted from '''[https://en.wikipedia.org/wiki/C-type_asteroid Carbonaceous-Type Asteroid]''' material. This requires 200-300 C temperatures, which reflectors can supply, and a container and condenser to capture the vapors. Water and carbon can be chemically reformed to oxygen and hydrocarbons, which are common high-thrust rocket propellants. This is useful when transporting people through the radiation belts or for landing on the Moon. They can also be used in electric engines for higher efficiency at lower thrust. Water, carbon compounds, air mined from low orbit, and possibly rock for soil can supply greenhouse modules, so that crews can produce their own food and recycle life support supplies.
 Metallic or '''[https://en.wikipedia.org/wiki/M-type_asteroid M-Type Asteroids]''' are thought to be the source '''[https://en.wikipedia.org/wiki/Iron_meteorite Iron Meteorites]''' found on Earth and Mars. They make up about 5% of known asteroids, with the metal portion being an iron-nickel alloy. A high temperature furnace can melt the alloy, a small amount of carbon added to make a steel alloy, and then cast into basic shapes.
 Steel makes up about 90% of all metal used on Earth. Being able to produce it from space sources would allow a much higher percentage of self-production in space. Subtractive and additive '''[https://en.wikipedia.org/wiki/Machine_tool Machine Tools]''' are used to turn basic metal shapes into finished parts. Those can be assembled, along with some imported items, into new machines, including more machine tools. New machines and constructed metal items can then work with other materials.
 Other space-made products can include '''[https://en.wikipedia.org/wiki/Basalt_fiber Basalt Fiber]''' made from lunar basalts, and '''[https://en.wikipedia.org/wiki/Carbon_fibers Carbon Fibers]''' from asteroid carbon compounds. These are are very high strength-to-weight. Fiber-reinforced metal structures are strong and relatively light weight. They would be useful for all kinds of construction.
 '''[https://en.wikipedia.org/wiki/Vacuum_deposition Vacuum Deposition]''' is relatively easy to do in high orbit since vacuum is the natural state of that region. Products can include lightweight reflector sheets, and parts for radiator panels. These can be combined with high-concentration solar cells from Earth to supply power with less mass than complete panels. '''[https://en.wikipedia.org/wiki/Refractory Refractories]''' are a class of materials that can withstand high temperatures. Some were formed in high-temperature environments in space, and others can be made artificially. They are used in all kinds of industrial processes such as furnaces and cooling systems for thermal processing of materials.
 In the long term, in-space production can supply up to 98-99% of the mass for space projects, greatly reducing what needs to come from Earth. The remaining 1-2% includes materials too rare in space to usefully mine, and products too hard to make relative to importing from Earth. Examples are electronics and drugs, which are already mass produced and high value for their weight. Importing them is easier than trying to make them.
:'''Living in High Orbit'''
 After science and and supporting existing satellites, the first people to spend much time in high orbits would be there to build up industry. But ultimately large, comfortable space habitats can be built as permanent living space, like towns and cities on Earth. Like the ones on Earth, they don't have to be built all at once. The first ones can be small, and attached to industrial production facilities.
 Larger residential habitats can also start small, but be designed to grow over time. Growth can be linear or in layers, like an onion. Linear growth can start with modules attached in a ring, with solar panels attached to each. The ring can be spun for artificial gravity. Additional rings can be stacked with the first one, with a ring of reflectors to direct sunlight to all the panels.
 Layered growth adds new pressure shells over compartments outside the previous ones. The outer shells are in vacuum, and provide radiation, meteor impact, and thermal shielding. Inwards of that are pressurized areas for storage and mechanical equipment. Then comes living quarters and a central open space. The entire habitat rotates for artificial gravity. As new layers are added, items are moved outwards to fill the larger space. Compared to building a large habitat all at once, this spreads the construction cost over time, and the habitat is only expanded when extra space is needed.
==='''8.4 - Phase 4C: Inner Interplanetary Locations'''===
 
:'''Inner Interplanetary Features'''
 These are orbits detached from the Earth's dominant gravity and go around the Sun instead, though they may pass close to the Earth at times. They range from as close as equipment can function to the Sun to 1.8 AU. This is just beyond Mars' greatest distance from the Sun (1.666 AU) and where the Main Asteroid Belt starts. It excludes Mercury, Venus, Earth, and Mars, and orbits around them.
 Solar power is available 100% of the time in these orbits, but the intensity varies from 31% to many times that near Earth, depending on Solar distance. Exposed temperature correspondingly varies from 244K (-29C) to very hot for dark objects, and less for bright or reflective ones. Travel time from Earth can range from months to years depending on orbit and propulsion method, and whether gravity assists from the planets are used. These save fuel, but usually require extra time.
 Solar and cosmic radiation are a moderately high background, with occasional flares/solar particle events that are much more intense, up to lethal human levels without shielding. Ping time ranges from a few seconds for orbits crossing near Earth, to over 45 minutes at 1.8 AU on the far side of the Sun, by way of a relay satellite. The Sun interrupts direct communication to the opposite side.
 As noted in section 2.1, there are nearly 32,000 known NEOs as of April 2023, and the number is currently increasing by 10% a year. There are another 1500 which don't come closer than 1.3 AU to the Sun and orbit within 1.8 AU on average. The largest among both sets, '''[https://en.wikipedia.org/wiki/1036_Ganymed 1036 Ganymed]''' isn't particularly easy to reach, but has about 100 times the mass of all the rock ever mined on Earth. So total material resources in this region is large.
 Asteroid orbits vary in size, are typically not circular, and somewhat tilted with respect to Earth's, so the energy required to reach a particular one varies. Timing also matters, since everything moves at different speeds in solar orbits. Efficient travel depends on a vehicle and the target arriving at the same place at the same time. The composition of asteroids vary across about a dozen spectral classes, indicating different chemical compositions.
 There are not many active comets in this region because the Sun's heat evaporates their ices in a short time. About 25 '''[https://en.wikipedia.org/wiki/List_of_minor_planets_and_comets_visited_by_spacecraft Minor Planets and Comets]''' have been visited by spacecraft so far. Most of our knowledge is from telescopes and examining meteorites that have fallen to Earth, and sometimes radar if they come close to us.
:'''Economic Uses'''
 There are only a few spacecraft currently in this region. They are mostly scientific probes in transit to other places, or stationed at the Earth-Sun Lagrange points 1 and 2 (ESL-1 and ESL-2). Future use is likely to start with asteroid mining and delivery to Earth orbit with electric tugs. About 75% of discovered asteroids in this region are more than 30 meters in size. This is due to limits of current telescopes rather than actual numbers, and may change with time. 30 meters implies a mass of 20-100 thousand tons depending on composition. This is too heavy to move whole with near-term propulsion. A method that should work with all sizes is scraping loose material or grabbing boulders from asteroid surfaces.
 Prior to mining, prospecting missions should visit multiple candidates for geologic mapping and sampling. Mining would start with asteroids that are easy to reach from Earth orbit, and return bulk ore there to be processed. As Earth orbits become more developed, they can start to send production and habitat equipment to this region in addition to mining. Since raw materials and full-time solar energy are available, this can grow in time to full size factories and produce habitats, vehicles, and whatever else is needed locally.
:'''Inner Interplanetary Transport'''
 The early transport in this region would be mainly slow but efficient electric tugs. They can haul large loads of rock relative to their mass, up to 1000 tons for a 10 ton vehicle and 23 tons of propellant. This will vary with the orbit destination and velocity changes needed. Smaller cargo loads can be moved faster with the same propulsion.
 '''[https://en.wikipedia.org/wiki/Gravity_assist Gravity Assists]''' can be used if the Moon and inner planets are in the right positions. Chemical rockets would be used when fast velocity changes are needed. Solar sails may be effective in moving things even more slowly but with no propellant use. This depends on large lightweight reflectors delivered to or made in orbit.
 Over time, a network of "transit habitats" can be built up. These are stationed in repeating orbits between planets and particular destinations. They would be larger, safer, and more comfortable than individual passenger vehicles. They can self-supply from nearby asteroids. This reduces having to send life support equipment and supplies each time for the relatively long trips in the region.
 Rotating platforms called '''[https://en.wikipedia.org/wiki/Skyhook_(structure) Skyhooks]''' can be built to provide both comfortable gravity and fast velocity changes. The platform mass stores momentum from very efficient propulsion that can be exchanged with payloads arriving and departing. The platform needs to be relatively heavy relative to each payload, so it doesn't change its own orbit much in use. Natural asteroids, production "slag" (leftover material not used in products), and the platform's own structure and equipment can serve this purpose. If traffic is balanced in direction, the net orbit change will be minimal.
 Skyhooks can serve as a space equivalent to airports - mainly used to get from one place to another. Like airports, they need enough traffic to justify their construction, and can be developed and upgraded over time. Building them is easier if high strength materials can be produced locally in space.
:'''Inner Interplanetary Production'''
 Global primary energy consumption on Earth was 18 TeraWatts in 2021. This includes mining, processing, and manufacturing about 2 million kg/s of materials. So the energy intensity of civilization is 9 MJ/kg on average. We will double this to allow for recycling of materials in space, and add 8 km/s of orbit velocity change, requiring 300 MJ/kg of electric tug power. That covers a reasonable range of interplanetary orbits.
 Transportation rather than production is then the dominant energy use in this region for new materials that need delivery. Modern space solar arrays typically product about 100 W/kg near Earth, and would take 36.8 days to produces the required 318 MJ. With a useful life of 20 years, their total energy output is 200 times that needed to transport their own mass in raw materials and all other energy needed to make replacement panels. Concentrating reflector and nuclear power sources are not yet developed enough for space to do calculate energy return ratios. They may turn out better or worse than solar panels, but as long as we have one known energy source with a high return ratio, we can base space industry on it.
 The same process of bootstrapping production in Earth orbits can be used in interplanetary space. This starts with mining for export, then simple products made locally, and gradually growing to make more complex ones. As distance from Earth increases, fewer raw materials would tend to from the Moon, and more from nearby asteroids. These asteroids are of different types, which provides a reasonable variety of materials to work with.
 If we restrict ourselves to within 20 degrees of the '''[https://en.wikipedia.org/wiki/Ecliptic Ecliptic]''', to maintain access to the planets and keep velocity changes lower, we have access to 1/3 of the Sun's total energy, or 1.3 x 10^26 Watts. This is 7 trillion times our current energy use, a number so large it is hard to imagine it could not sustain civilization.
:'''Living Beyond Earth Orbit'''
 Once methods of living in orbits around Earth are developed in the previous phases, doing so in solar orbits beyond the Earth-Moon region can use the same basic technologies. The main adjustments would be for available solar energy and temperature with distance from the Sun, and the kinds of materials found relatively nearby in velocity terms. In space, velocity changes take work, while coasting to a destination merely takes time.
 It isn't yet clear if a "hunter-gatherer" or "sedentary" lifestyle would be more effective. The first means moving equipment to new asteroid locations as needed, while in the second the it stays in a particular orbit, and materials are brought to it. Since everything is in relative motion around the Sun, opportunities will change with time. So choosing a particularly useful asteroid as a home location may be a good strategy.
==='''8.5 - Phase 4D: Mid-Interplanetary Locations'''===
 
 Living and working in the next region out from the Sun is a smooth continuation of the previous phase, but is different in having lower levels of solar energy and much larger amounts of raw materials.
:'''Mid-Interplanetary Features'''
[[File:InnerSolarSystem-en.png|thumb|600x600px|Figure 8.5-1 - Main Asteroid Belt and Jupiter Trojan region.]]
 This region includes orbits from 1.8 to 6.0 AU in semi-major axes (Figure 8.5-1). As of 2023 this includes dwarf planet '''[https://en.wikipedia.org/wiki/Ceres_(dwarf_planet) Ceres]''', 1.18 million other Main Belt asteroids, over 5600 '''[https://en.wikipedia.org/wiki/Hilda_asteroid Hildas]''', which are in 3:2 resonance with Jupiter, and over 12,500 '''[https://en.wikipedia.org/wiki/Jupiter_trojan Jupiter Trojans]''' that occupy the Lagrange regions ahead of and behind the planet. It does not include Jupiter itself and the region within 20 million km of the planet (Section 9.4).
 There are around 450 known comets in the region. The '''[https://en.wikipedia.org/wiki/Frost_line_(astrophysics) Frost Line]''' for water is in this region at 2.7-3.2 AU. So this is where many comets become active (give off gas and dust), making them easier to find. Hydrogen and oxygen are the 1st and 3rd most common elements, and helium (2nd) doesn't make compounds. So water is the most common compound of two elements. Objects beyond the frost line tend to have have large amounts of it.
 Solar power is available 100% of the time except shadowed areas on and around objects. Intensity varies from 31 to 2.78% of that near Earth. Temperature varies from 244 to 217K (-29 to -56C) for black objects, and less for lighter colored ones. Travel time from Earth is months to years on minimum energy transits, with high to lethal radiation levels for unprotected people. Ping time varies from 13 to 120 minutes, including a relay to avoid a direct path through the Sun.
 The vast and growing number of known objects in the region have a total mass of about 3 billion Gigatons, which far exceeds the Earth's total mining output of about 60 Gigatons/year. About half the total mass is in the four '''[https://en.wikipedia.org/wiki/List_of_exceptional_asteroids Largest Asteroids]''': 1 Ceres, 4 Vesta, 2 Pallas, and 10 Hygeia. Composition varies considerably between asteroids due to differences in their formation and history. Velocity to reach orbit from the largest body, Ceres, is only 270 meters/second, or 860 times less kinetic energy than from Earth. So all these objects are easy to access once you are near them. The main energy cost is in adjusting your orbit around the Sun.
:'''Economic Uses'''
 This region has very few of spacecraft at present, so most uses are in the future. Abundant raw materials of diverse composition, and adequate amounts of solar energy when concentrated, will enable mining and transport to earlier locations as early activities. Previous locations have higher solar intensity for production and habitation. When it makes sense to do so, seed factories and other advanced technologies can help bootstrap a full range of local industry, and eventually large scale habitation. There is enough material and energy in this region to support a full civilization.
:'''Mid-Interplanetary Transport'''
 The same transport methods can be used in this region as for the inner interplanetary region. The main difference is adding reflectors to solar panels to make up for the lower solar intensity. Electric catapults and skyhooks are somewhat more efficient for injecting bulk cargo to transfer orbits, because they do point acceleration rather than spiral orbits. If a large asteroid absorbs the reaction force, they also don't need propellant. Gravity assists from the inner planets and Jupiter can also increase efficiency.
:'''Mid-Interplanetary Production'''
 The inner parts of this region have enough sunlight for solar panels to produce power directly. In the outer regions, solar panels benefit from reflectors to increase the light intensity. Concentrating reflectors can produce higher temperatures at all distances, either for industrial processes or habitats. Increasing amounts of reflectors are needed as you get farther from the Sun, but they are inherently lightweight in a zero gravity environment with no weather. Note that the total amount of solar energy available in this region is the same as for the Inner Interplanetary region. It has simply traveled farther and is more spread out. The difference is access to larger amounts of raw materials.
 Asteroids are covered in a mixture of rocks and dust of varying sizes. This is the result of repeated impacts over their life and gravitational attraction. In fact, some asteroids are so low in density that they must be "gravel piles", with no solid central body. Since most asteroids are small, the rocks and dust are easily disturbed and can become a hazard to mining and production operations. So material has to be removed carefully without too much disturbance. Alternately the mining area or the whole asteroid can be covered to contain loose material.
 More distant asteroids and comets contain water and other volatile compounds. These can be extracted separately by heating. Bulk or separated products are then moved by tugs to factories for later production steps. For larger operations, a shell can surround the whole asteroid, keeping gas and dust contained. Processing equipment can then be attached to the outside of the shell, and materials delivered continuously until the asteroid is consumed. The mining and production unit can then move to another target, or the target moved to the unit, whichever is lighter.
==='''8.6 - Phase 4E: Outer Interplanetary Locations'''===
 
 This region is again a continuation of the previous one, with even less solar energy and about 40 times more available materials.
:'''Outer Interplanetary Features'''
 Outer interplanetary orbits range from 6 to 60 AU in semi-major axis. The areas close to Saturn, Uranus, and Neptune are excluded. They are accounted for in Phase 5E (Section 9.5}. As of 2023 there are over 500 known '''[https://en.wikipedia.org/wiki/Centaur_(small_Solar_System_body) Centaur]''' objects. These have orbits among the four giant planets, whose gravity makes them unstable over a few million years. There are also thousands of known '''[https://en.wikipedia.org/wiki/Trans-Neptunian_object Trans-Neptune Objects]''' with orbits beyond that planet, making a total of about 3800 in this region. Some, like Pluto and Eris, are large enough to be considered '''[https://en.wikipedia.org/wiki/Dwarf_planet Dwarf Planets]'''. The remainder are in the range of 15 to 850 km, with the lower end set by our current telescopes' ability to find them. There are undoubtedly smaller ones that are undiscovered.
 Available solar power is low, from 2.78% to 0.0278% of near-Earth values. This requires large reflectors to increase intensity, nuclear fission or fusion (if developed), or beamed energy from closer to the Sun. Ambient temperatures are extremely cold, from 160 to 50K for black objects, and lower for lighter ones. Travel time from Earth is typically many years, with high to occasionally lethal radiation levels for unprotected people. Ping time is 1.4 to 17 hours.
 The number of known objects is much smaller than the Mid-Interplanetary region, but their mass is roughly 40 times larger - about 2% of Earth or nearly double the Moon. With increasing distance from the Sun, gases and ices with lower boiling points condensed from the original Solar Nebula. So there is more water, ammonia, nitrogen and other frozen materials, along with rocks and metals. The distinction between asteroid and frozen comet becomes fuzzy, so we call all of them 'objects' and the smaller ones 'minor planets'.
:'''Outer Interplanetary Activities'''
 This region is likely too far to use with current technology. Activities beyond science and exploration are far enough in the future that technology is likely to change in unexpected directions. When other activities would start and what they will be is undertain, but we can speculate based on what we know today. The raw materials in the region are different than those closer to the Sun. So the first activities are likely to be mining materials scarce closer to the Sun, and bringing them to where there is more energy to process them.
 Due to weak sunlight in this region, nuclear propulsion and gravity assists from the larger bodies are likely to be major transport methods. The solar system has a limited amount of natural '''[https://en.wikipedia.org/wiki/Radionuclide Radionuclides]''' that can produce useful power levels. If '''[https://en.wikipedia.org/wiki/Fusion_power Fusion Power]''' is not developed enough, they can be made artificially near the Sun where abundant energy is available. If nuclear fusion is well developed, there is abundant hydrogen from which fusion fuels can be produced.
 As distance increases from the Sun, orbit velocities and required velocity changes decrease as the square root of. Solar flux decreases faster, as the inverse square of distance. So solar sails become less effective than for closer regions. Beamed energy from close to the Sun is a possibility. It requires large optics to focus the beam to a reasonable size at destinations in the region.
 We don't expect a lot of production here at first. Water and nitrogen are very useful and found in large amounts. Transport would be slow using minimum energy trajectories. If there is enough demand, a "pipeline" of bulk cargoes in transit could be set up, with vehicles at each end to set them on course and collect them at the end. The cargo can coast in between, saving on vehicle use. Once the pipeline is filled, then cargoes arrive on a regular schedule.
 If lightweight solar reflectors or fusion are developed enough, a full economy based on them may develop, with full production and habitation. We don't see a strong reason to live this far out rather than the warmer and brighter inner regions, but such reasons may develop.
==='''8.7 - Phase 4F: Distant Orbit Locations'''===
 
 The previous three phases are called 'interplanetary' because they are among or near the eight known major planets. This last region is beyond all of them so we call it 'distant'.
:'''Distant Orbit Features'''
 Distant orbits range from 60 AU in semi-major axis to the limits of the Sun's dominance at about 100,000 AU. As of 2023 there are about 1200 known asteroids and comets in the region. It includes about 650 '''[https://www.minorplanetcenter.net/iau/lists/t_centaurs.html Scattered Disk]''' and '''[https://www.minorplanetcenter.net/iau/lists/t_tnos.html Trans-Neptune]''' objects, and a similar number of
'''[https://en.wikipedia.org/wiki/List_of_long-period_comets Long Period]''' and '''[https://en.wikipedia.org/wiki/List_of_near-parabolic_comets Near Parabolic]''' comets.
 A few of these objects belong to much larger and more distant populations known as the '''[https://en.wikipedia.org/wiki/Hills_cloud Hills]''' and '''[https://en.wikipedia.org/wiki/Oort_cloud Oort Clouds]'''. For our purposes we define these as orbits with axes from 2000-10,000 AU and 10,000 to where passing stars, gas clouds, and galactic tides make orbits unstable. This is roughly 100,000 AU. The existence of comets whose orbits extend to these distances argues for the cloud's existence. Otherwise no active comets would be left after billions of years. Their total number and mass is only guessed at, but may be billions to trillions and multiples of the Earth's mass. There is some evidence to suspect a major planet is also in this region.
 Current telescopes are limited to finding objects within about 80 AU from the Sun. So only the ones that come within the 60-80 AU range at their closest ''and'' are currently at the near end of their orbits have been found to date. We expect to find many more objects in the region as telescopes improve. Active comets from distant orbits which come close to the Sun give us some information on composition from the gas and dust they emit.
 Solar energy is very weak in this region, below 0.0278% of that near Earth, and temperatures are extremely cold, from 50K down to near the cosmic background of 2.7K. Travel time with current propulsion technology is many years to centuries. Ping time ranges from 14 hours to 3 years.
:'''Distant Orbit Activities'''
 Our current information about objects in this region is poor. So any uses beyond science and exploration are deferred to the far future. When that time comes, though, there is a very large reserve of materials that can be put to use. One identified use is the Sun acting as a gravitational lens, with a focus around 800 AU from the Sun, in the Scattered Disk region. Placing telescopes directly opposite a star of interest would allow much more detailed observations than otherwise possible, because of the 2 million km optical diameter of the Sun as a lens.
 To keep transport times within reason, very high energy propulsion would be needed, such as nuclear fusion. Since the light elements needed for fusion are common in these outer regions, this could be self-fueling once set up. Unfortunately, fusion is not yet a viable technology. Transport that uses it remains speculative at present. Due to the low to nearly non-existent solar energy in this region, nuclear energy sources would likely be needed to even consider local production. Production must remain speculative at present.
=='''9.0 - Planetary System Locations'''==
 
 The planetary systems of Phase 5 are different in several ways from the orbital locations in Phase 4 and from each other. Specific designs are needed to handle the differences, so we identify separate sub-phases for each. First are their gravity fields, which require energy to travel through and create significant surface gravity. Second are their large sizes relative objects in the orbital regions, and third is the diversity of conditions found on and around the planets.
 Reasons to use planetary systems include access to the different raw materials available, relief of Earth's biosphere by moving industry off-planet, and some people's preference for natural environments. As with orbital locations, the start of each sub-phase is staggered from nearest to furthest, and is preceded by orbital transport that can reach them carrying useful amounts of equipment. So Phase 4 and 5 projects will overlap in time.
==='''9.1 - Phase 5A: Lunar Locations'''===
 
 Earth is one of the eight major planets in the Solar System. It is already occupied and developed, and we covered using our technical approach earlier in this report. We also covered most orbits around Earth in Sections 8.2 and 8.3. The exception was the '''[https://en.wikipedia.org/wiki/Moon Moon]''' and the area around it. We place it here among other planetary systems since lunar activities are more similar to those for smaller planets and the larger moons of the other planets.
:'''Lunar Features'''
 The Lunar region includes the Moon itself, and orbits with semi-major axes below 35,000 km . These are close enough to be relatively stable. Lunar orbits in general are somewhat unstable. The Moon has mass concentrations from past impacts that create an uneven gravity field (Figure 9.1-1). The Earth and Sun are also much more massive than the Moon, and have significant effects on objects orbiting it ([https://link.springer.com/article/10.1134/S0038094617070061 ''Gordienko, 2018'']).
 The Moon has the same average distance from the Sun as the Earth, so available solar energy and basic temperatures ranges are the same. Sunlight is partly blocked in lower Lunar orbits, and blocked about 50% of the time on the surface over a 29.5 day cycle. Surface gravity averages 1.62 m/s<sup>2</sup>, or 1/6th of Earth, with a total variation of 0.025 m/s<sup>2</sup> by location.
 Escape velocity from the Lunar surface is 2380 m/s, or 21% of Earth. So escape energy is only 4.5% of Earth's. Low orbit velocities are 1680 m/s or less, and 700 m/s more is needed to escape from them. Circular orbit velocity at the upper edge of the region is 375 m/s, and escape is an added 155 m/s. Surface area of the Moon is 37.93 million km^2 measured horizontally, or about one quarter of the Earth's land area. Sloped terrain increase the total exposed surface area.
[[File:Moon_gravity_acceleration_map_LGM2011.jpg|thumb|right|800x450px|Figure 9.1-1 - Lunar surface gravity map. Near side on left, far side on right.]]
 Earth is only 81.3 times the Moon's mass. So the center of mass of both averages 1/4 of the way down from the Earth's surface to it's center. Both move around this center every 27.3 days with respect to the stars. Since both also orbit the Sun, the Moon's orbit and day lengths are not the same.
 The Moon is tidally locked to Earth, and keeps approximately the same side facing us. It is not exact because the Moon's orbit is not circular, it has a slight residual pendulum motion, and we have different vantage points from the Earth's surface. So about 59% of its surface can be seen from Earth over time. The two hemispheres are called the "near" and "far" sides. There is no "dark" side, since both get sunlight during a lunar day.
 Orbits around the Moon vary from 108 minutes close to the surface, to 6.8 days for the largest ones in the region. Travel time from Earth is 3-4 days for direct transfer orbits. Electric propulsion is much more efficient, but also much slower. Without shielding, travel to and staying on and around the Moon can expose people to lethal radiation levels. This is from Earth's radiation belts, solar, and cosmic sources. Ping time from Earth to the Lunar region varies from 2.2 to 2.94 seconds, depending on where in the region, and the Moon's distance in it's orbit. This includes satellite relay time if communicating with areas that can't be seen directly from Earth.
 The Moon has a somewhat variable and reasonably well understood '''[https://en.wikipedia.org/wiki/Geology_of_the_Moon Geology]'''. This is known from a number of lander and orbital missions, some of which returned samples, and '''[https://en.wikipedia.org/wiki/Lunar_meteorite Lunar Meteorites]''' thrown to Earth by impacts. Broadly, the surface is oxide minerals with silicon, iron, calcium, aluminum, and magnesium, in order of abundance, and 3-4% other elements.
 The Moon is too small and warm to keep an atmosphere. With nothing to stop them, the surface has been heavily cratered and broken up by repeated impacts of all sizes. The result is a '''[https://en.wikipedia.org/wiki/Lunar_soil Regolith]''' or lunar soil that has been tossed around many times. It is a mix of the original crust and the remains of impacting objects. There is no weathering like on Earth, but the solar wind can charge dust particles which then move, and temperature cycles cause rocks to crack near the surface.
:'''Economic Uses'''
 The Lunar region is embedded in the High Orbit region, and reaching it from Earth is possible with current and near-term transport. Science and exploration activities are already in progress. Further development can start as soon as there are economic reasons for it. The first uses are likely to be local on the surface, and from the Moon's relative closeness to populated satellite orbits and low energy to reach these orbits. For example, some '''[https://en.wikipedia.org/wiki/Lunar_water Water]''' appears to be trapped in cold polar craters on the Moon. It has multiple uses, and could be delivered relatively efficiently to high and low Earth orbits.
 Regolith mining can supply enough materials for much larger projects on the Moon and nearby orbits. The loose surface layer averages 5 meters thick across the whole Moon. It can be collected without using heavy equipment and totals about 300,000 Gigatons, or 7,000 years of Earth's total stone and sand mining in 2020. Projects that use lunar (and asteroid) materials are not as limited by launch mass and cost from Earth, so they can use simpler and heavier designs. In the future, production that uses lots of energy, or have hazards and side effects, could be moved to space to reduce the burden on Earth's environment.
 Satellites that beam energy to Earth is one possibility. If this can be done economically, it might become the largest export market from orbit. Renewable energy on Earth is now relatively low cost, but it is variable and some places have poor conditions for using it. There is 10 times more solar energy in space than such places and it is more predictable. So it may prove useful, despite the extra cost of building in space.
:'''Lunar Transport'''
 Early landings on the Moon would not have the support of much infrastructure. They would use current high thrust chemical rockets to access the surface. At first, all propellants would come from Earth. Water from polar lunar craters can supply 83.5% of methane/oxygen propellant, and and also life support supplies, reducing the mass needed from Earth. Carbonaceous type asteroids contain up to 20% carbon compounds and water. These can be reformed chemically to CH<sub>4</sub> and O<sub>2</sub> and fully replace Earth supplies. How much would come from each source will depend on cost and availability.
 Over time, chemical propulsion can be replaced by more efficient methods. As mentioned in Section 8.3, an electric catapult can deliver 1000 times a solar array's mass per year from the surface to Lunar orbit. Electric propulsion can then move lunar and asteroid materials a common orbit for processing. High orbits around the Moon or Earth are preferred for their near-full time sunlight and a combined low velocity to reach. Both propellants and other products can be made with processing and manufacturing equipment in the same location.
 Lunar basalt and carbon from asteroids can be used to make high strength fibers. These can be used to build an efficient skyhook system in lunar orbit. Such a system makes sense if there is enough traffic to the Moon. If the tip velocity is equal to orbit velocity they cancel, and trips to the lunar surface would need very little fuel. A lander can be dropped off and picked up at low altitude. It would not be dropped directly on the surface because of the variable gravity field and heights of lunar mountains and crater walls.
 If the skyhook is in near-polar orbit, it can access any point on the surface every 15 days as the Moon rotates below it. Using other angles of the skyhook's rotation, and by climbing to different distances from the center, arrival and departure directions and speeds up to 1.41 times lunar escape are possible. Catching and releasing vehicles affects the skyhook's orbit. If traffic is balanced in direction and mass, and the skyhook is massive enough, it is a temporary change. If traffic is more in one direction than the other, the difference can be made up by electric propulsion at high efficiency.
 Low gravity is known to be harmful to people. If the skyhook radius is about 250 km, the tip acceleration will be about 1 g, which avoids this problem. A large supply of lunar materials can supply shielding. With these people can live comfortably and safely. They are close enough to the lunar surface to operate equipment by remote control in real time. Alternate solutions are using rotating habitats on the surface or limiting stay times.
:'''Lunar Production'''
 The advantages of using the Moon are relative closeness to high orbits, and low energy to move cargo. But there are few low boiling-point materials left on the Moon, because it formed in a molten state, suffered many high energy impacts and early tidal heating, and is too small to keep an atmosphere. A fully-developed space economy would need to supplement lunar materials with those from nearby asteroids and from Earth. Some materials are too rare to usefully mine in space, and some products are too hard or expensive to make there relative to delivery from Earth. So two-way trade can develop for lunar activities to support themselves.
 Early Lunar production can start with mining bulk regolith for radiation/thermal/impact protection, and polar ice for propellant and life support. These don't need a lot of complex equipment. More energy-intensive and complex processes like vacuum oxide reduction and '''[https://en.wikipedia.org/wiki/Carbothermic_reaction Carbothermic Reactions]''' can separate oxygen and various metals from the regolith. Seed factory equipment can be used to bootstrap making other products for local use and export. As better transport systems are installed in sequence, the cost of delivery elsewhere will decrease.
 Solar energy will likely be the dominant energy source for lunar production. Silicon for solar cells, aluminum for reflectors, and other metals for structures are widely available from the regolith to provide solar power. However some craters with water are permanently shadowed, the lunar night is two weeks long, and large solar plants are not very portable. So other energy sources may be useful.
 Some regions of the Lunar surface contain ~10 parts per million Uranium and Thorium. The ore has an energy content of about 800 MJ/kg (20 times that of coal on Earth). Helium-3 has been proposed as a fusion fuel to be mined from the Moon. Although the energy content of pure He-3 is 200 TJ/kg, the concentration is only 15 parts per billion or less, resulting in an ore content of only 3 MJ/kg. So fissionable elements are a better energy source on the Moon in terms of energy produced per ton of mined ore.
 Other energy sources for the Moon can include the rims of shadowed craters, where sunlight is highly available, microwave or laser beamed power across terrain or from orbit, and even fuel cells or batteries for portable power. Thermal energy storage is an option using the vast amount of rocks and dust as the storage medium, and the natural vacuum as insulation. The material is heated during the day by sunlight, and the heat used to generate power during the Lunar night.
:'''Living in Lunar Locations'''
 Low gravity is known to be harmful, so long-term habitats on the Lunar surface may require rotation to create artificial gravity. An example would be a large habitat dome for spaciousness, and a centrifuge built around the rim for living quarters. Residents would spend enough time in the centrifuge to maintain health, but could work and enjoy the low gravity the rest of the time.
 We have essentially no data on how much gravity is enough between zero and 1.0. We know the body deteriorates over time in zero gravity. So as a worst case, people would need to spend most of their time in a one gee environment of some type, but this subject needs more research. Another option is limiting permanent stay times on the surface. People would live mostly in orbit with artificial gravity and operate most equipment by remote control.
 The other requirements for people to live and work in the lunar region have mostly been solved by existing space stations, and using bulk materials for shielding. One exception is lunar dust, which is abrasive, toxic, and is everywhere on the surface. Various methods to deal with it have been proposed, but R&D is needed to figure out which work best.
==='''9.2 - Phase 5B: Mars Locations'''===
 
 '''[https://en.wikipedia.org/wiki/Mars Mars]''' is next among planetary locations in terms of velocity and time to reach, and the environment conditions there. It is a large step beyond the Moon, but Mars is within the inner interplanetary region (Section 8.4) that Earth also occupies. So we expect Martian activities to start after some level of development of the region in-between.
:'''Mars Features'''
 The Mars region includes the planet, two small moons, and reasonably stable orbits with semi-major axes up to 340,000 km (100 radii). Its orbit around the Sun is 9.3% eccentric, varying from 1.38 to 1.67 AU in distance. Solar flux varies with distance from 494 to 716 W/m<sup>2</sup>, or 36 to 52.5% of that near Earth. Surface gravity varies from 3.683 to 3.743 m/s<sup>2</sup>, a 1.6% range, with a reference value of 3.711 (3/8ths of Earth). Lower values are near the equator and atop tall mountains, while higher values are at lower altitudes in the north polar region and '''[https://en.wikipedia.org/wiki/Hellas_Planitia Hellas]''' basin.
 Ping time from Earth varies from 6 to 45 minutes, depending on relative orbital position and need for a relay satellite to avoid the Sun. Unprotected radiation levels range from high to lethal, but the Mars surface and its moons provide ample material for shielding.
 Escape velocity from the surface is 5,027 m/s, and is 502 m/s at the upper edge of the orbital region. Circular orbit velocities are 70.7% of escape. This ratio holds for orbits around any body. Escape energy is 20% that of Earth. Orbits around Mars vary from 100 minutes for low ones to 70 days at the edge of the region. Surface area of Mars is 144.8 million km<sup>2</sup>, or 97% of Earth's land area. Day length is 24h 40m, slightly longer than Earth, and the Martian year is 1.881 Earth years. Travel times vary according to the relative positions of Mars and Earth, and the transport method used. When aligned, minimum energy orbits average 7 months one way.
 The moons '''[https://en.wikipedia.org/wiki/Phobos_(moon) Phobos]''' and '''[https://en.wikipedia.org/wiki/Deimos_(moon) Deimos]''' have near-circular orbits of with 9,377 and 23,460 km radius. They have mean diameters of 22.5 and 12.4 km, but are irregular shapes. They have a combined mass of 12,800 Gigatons, or 290 years of Earth's rock and sand mining. This is a significant orbital resource. They are likely collected impact debris, so similar to Mars in composition.
[[File:Generalised_Geological_Map_of_Mars.jpg|thumb|700x1024px|Figure 9.2-1 - Generalized geologic map of Mars.]]
 The atmosphere is 96% CO2, a bit under 2% each Argon and Nitrogen, and an assortment of trace gases. Surface pressure varies from 30 Pascals at the top of Olympus Mons to 1155 Pascals in the Hellas basin. The high value is 1.14% of sea-level pressure on Earth. Pressure varies by 30% annually, as some of the CO2 freezes and evaporates at the poles. Surface temperatures vary from 120 to 293K (-153 to 20 C), depending on latitude and season. Typical day-night variation is 70K/C because the atmosphere does not have much thermal mass.
 Mars has quite a varied surface geology, as a result of internal melting and vulcanism, impacts, and much higher levels of water and atmospheric pressure earlier in it's history (Figure 9.2-1 from '''[http://pubs.usgs.gov/sim/3292/ USGS Map 3292, 2014]'''). There is significant amounts of water in the soil as hydrates, permafrost, and in thick dusty ice caps.
:'''Economic Uses'''
 Human activity in the region can begin with a scientific outpost. It would be an extension of existing robotic exploration, and Phase 4C activity among asteroids in the surrounding region (Section 8.4). The outpost and relay satellites are placed in orbit close enough to Mars for real-time remote control. Surface robots carry out science and sample collection at first, with some samples returned to the outpost for further analysis. Most outpost supplies can come from Mars' moons and nearby asteroids.
 Over time, other robots and equipment are delivered to the surface to start to preparing for people. Once enough supplies and basic production are in place, they can start to visit. This approach delays risking people on the surface until a supply chain and reliable two-way transportation is available.
 As more production capacity is built up on Mars and surrounding orbits, it can start to transition from science to prospecting for unique resources, building up local habitation, and a full economy. Since Mars has almost the same land area as Earth, there is plenty of room to do this. Building up activities in the Mars region would be a relatively small extension from previous regions. So it is not a large cost burden, but rather an investment in further growth.
:'''Mars Transport'''
 In Phases 4B and 4C (sections 8.3 and 8.4 above), electric tugs were used to move asteroid materials back to Earth/Moon orbits for processing. To expand towards Mars, the same type of tugs move materials from Near Earth or Near Mars orbits to specific '''[https://en.wikipedia.org/wiki/Mars_cycler Mars Cycler]''' orbits. These orbits allow repeat flybys of Earth and Mars using gravity assists. Given the many thousands of asteroids in the interplanetary region, some of them have low velocity to and from a cycler orbit.
 Other tugs deliver habitat modules and initial processing equipment from near Earth to the same orbit. The raw asteroid materials are distributed around the habitat for radiation shielding, and used as a counterweight for artificial gravity. At the next opportunity a crew meets up with the new "Mars Transfer Station", and begins to process the raw materials into fuel, air, water, metals, etc. They also establish a greenhouse to produce food. When raw materials run low, a tug is sent to another nearby asteroid to get more.
 Whenever the Transfer Station is near Earth, new crew, equipment, and supplies can be delivered. Crew aboard the transfer station are safe from radiation hazards, have gravity to maintain health, and can eventually produce most of what they need themselves. The Station can be used multiple times to bring new crews to Mars, saving mass over carrying a life support system and supplies for every trip. Cargo besides people can travel to the Mars region directly with tugs.
 When the transfer station is built up enough, a set of crew detach and inject into Mars orbit. The Martian moons then become a source of materials in addition to nearby asteroids. Eventually enough propellants are produced locally for trips to the planet's surface.
 Chemical rockets consume a lot of propellants traveling back and forth from the surface. In the longer term, some combination of skyhook and surface catapult can replace most of that. These would be large projects, but the propellant savings for each trip makes up for it. Carbon from asteroids or the moons, and basalt from Mars, can be used to make the strong fibers for such systems.
 Skyhooks can start small with low capacity, but their orbit parameters and timing would be shifted from bulk going up. Linear or rotary electric catapults on the surface are attached to the planet and not affected this way. To limit drag losses they would be built on the large Martian volcanoes. Mixed use of both systems is also possible. It is too early to choose among these or other options, but chemical rockets are inefficient. In the long run something better would be preferred.
:'''Mars Production'''
 Like other phases of our program, the production in the region starts with mining raw materials for basic products with ready-to-use equipment. Seed factory equipment is delivered to orbit and the surface as needed. This bootstraps more diverse, larger scale, and advanced production. The supply chain from Earth and intermediate regions supports this with regular deliveries.
 Mars has a different history than asteroids, so it likely has sources of volatile compounds and minerals not common in the orbital regions. Very efficient bulk transport is desirable for an export market to develop. Because the gravity well of Mars requires large-scale systems to do this, exports may not be economic right away, but rather need a build-up period in the region first.
:'''Living in Mars Locations'''
 Living in the orbital region around Mars would be similar to high orbits around Earth or the interplanetary region that surrounds both. There would be minor differences in available solar energy and local material sources. Living on the surface would require adapting designs to local conditions of gravity, temperature, and other parameters. Since gravity is 3/8 Earth normal, that includes how to maintain health for people and other living things. Example methods are body weights and rotating habitats.
 '''[https://en.wikipedia.org/wiki/Terraforming Terraforming]''' Mars has often been suggested because it is already the most similar place to Earth. Doing this for a small population is likely too much effort for the amount of use it would get. When the population gets large enough or technology has advanced enough the local population (Martians) can decide if terraforming makes sense. Self-improving production systems can make such a project easier.
 An alternate approach is to use habitat domes to provide a feeling of being outdoors. Internal pressure would be much higher than outside. So lightweight domes need a lot of structure and anchoring to avoid lifting off the ground. Domes can be weighted down by bulk soil and rock, or using thick glass. These also provide radiation, temperature, and impact protection.
==='''9.3 - Phase 5C: Venus and Mercury Locations'''===
 
 '''[https://en.wikipedia.org/wiki/Venus Venus]''' and '''[https://en.wikipedia.org/wiki/Mercury_(planet) Mercury]''' are the next in difficulty after Mars. They have abundant solar energy available, but as a result are mostly very hot. There are relatively few nearby asteroids to start orbital development with.
:'''Venus and Mercury Features'''
 The Venus and Mercury regions include the planets, and relatively stable orbits within 600,000 and 100,000 km of their centers, respectively. Like Earth they are embedded in the Inner Interplanetary region (Section 8.4). They have no known moons. So the main interest is the planets themselves and activity around them. Venus' orbit is nearly circular at 0.723 AU, while Mercury's is 20% eccentric and varies from 0.307 to 0.467 AU.
 Solar flux is 1.9 times higher than near Earth at Venus, and 4.6-10.6 times higher at Mercury. Equilibrium temperatures in sunlight are 17% and 46-80% higher in Kelvin. The surface temperature is 735K (462 C) for Venus, from a thick atmosphere with a strong greenhouse effect. Mercury ranges from below 100K in shadowed polar craters, to as high as 700K at the sub-solar point at perihelion. A given location can vary nearly this whole temperature range due to a 58.6 day rotation period. Venus's rotation takes 243 days, but the atmosphere mostly eliminates temperature changes.
 Venus' surface gravity is 8.87 m/s^2 (90% of Earth), and Mercury's is 3.7 m/s^2, the same as for Mars. Escape velocities are 10.36 and 4.25 km/s from their surfaces and 1,041 and 664 m/s from the outer edge of their regions. Orbits range from 90 minutes to 59 days around Venus, and 85 minutes to 15.5 days around Mercury. Ping times from Earth vary from 4.3 to 30 minutes for Venus, and 9 to 25 minutes for Mercury. Travel times by least energy transfer orbits are 4.8 and 3.5 months respectively.
 The '''[https://en.wikipedia.org/wiki/Geology_of_Venus Geology of Venus]''' appears to be mostly volcanic, and it has lost most of its water to space. The atmosphere has a surface pressure of 9.2 MPa (90.8 times Earth), and is composed of 96.5% CO2 and 3.5% Nitrogen, with some trace gases. While it is very hot at the surface, moderate pressures of 0.5 times Earth and temperatures around 27 C exist at 55 km altitude. Mercury has only a trace atmosphere, and a '''[https://en.wikipedia.org/wiki/Silicate_mineral Silicate]''' surface about 40% O, 25% Si, 11% Mg, 6% Al, 4% each Ca and Fe, and 2% S. Polar regions can have surprisingly moderate average temperatures, and water ice has been found in shadowed polar craters
:'''Economic Uses'''
 Near-term use of Venus and Mercury is more difficult because of the higher velocity to reach them and generally hostile temperatures. Scoop-mining gases from the upper reaches of Venus' atmosphere is a possibility. In the mid-term, floating habitats are possible at altitudes where temperature and pressure are reasonable. Polar stations on Mercury can take advantage of lower average temperatures with proper insulation. In the long term asteroid iron or aluminum can be used for orbiting sunshades to cool both planets where needed.
 Reducing temperature lowers the scale height of Venus' atmosphere, and preferentially lowers the pressure of the high altitude regions of the planet, making them more accessible. There is the possibility that low enough temperatures will promote carbonation of the volcanic surface minerals, further lowering pressures, and that this process can be enhanced artificially. If the surface conditions can be made more tolerable, then large scale access to raw materials plus high energy available in orbit could promote industry.
 It takes 7 to 12 km/s velocity change to travel from near Earth to the Venus and Mercury orbit regions, and therefore 0.15 and 0.27 kg of propellant per kg cargo using electric thrusters. This does not account for gravity assists or skyhook transfers. These require 263 and 474 MJ of solar power respectively. If the cargo is all solar arrays, or equivalent thermal power generation, they will produce an additional 13.75 and 91.5 MJ/day added power output, and repay the extra energy use in 19 and 5.2 days respectively. So energy-intensive processes highly favor going closer to the Sun.
:'''Venus and Mercury Transport'''
 Higher orbit speeds as you get closer to the Sun means more velocity changes are needed to reach them. Like elsewhere, gravity assists and skyhook systems can help do this more efficiently. Solar-powered electric propulsion is quite viable closer to the Sun. Solar flux increases faster then velocity changes, so this introduces the possibility of solar sails as an additional transport method in the inner regions. The advantage of solar sails is they do not consume propellant. But in the outer Solar System low solar energy makes them very slow.
 For example, reflected sunlight provides 15.5 Newtons/km^2 at Venus, and a 1 micron thick Magnesium-Aluminum sail would mass 2400 kg/km^2. This generates 558 m/s/day acceleration for the bare sail. This is reduced by the remaining structure and cargo mass, and by angling the sail to control thrust direction. This acceleration is comparable to that for electric propulsion using solar array mass near Earth. A combined system can take advantage of reduced propellant use from a sail and wider thrust angles from the electric engines.
:'''Venus and Mercury Production'''
 Production in the Venus and Mercury regions would likely start in orbit as an extension of Inner Interplanetary activity. The higher solar flux relative to energy needed to reach inner orbits favors processes that need lots of energy. Raw materials can come from nearby and imported asteroid sources, and possibly scoop mining gas from Venus orbit. There are only 59 known asteroids whose orbit is entirely inside Earth's, and less than 2500 others whose orbit is smaller than Earth's and cross inside of it. This is only 0.2% of the total known, so many materials may have to be imported from farther away.
 Habitats to support production, with artificial gravity, thermal, and radiation shielding can be built in more developed regions and transported to Venus and Mercury orbit to start with. Surface catapults are possible from Mercury's polar regions, where temperatures are more moderate. The combination of materials delivered at least partly by solar sailing and abundant solar energy should allow production to grow in time.
:'''Living at Venus and Mercury'''
 Living in orbits around the two planets would be similar to the nearby interplanetary region, and not require much new design. The planets themselves are mostly hostile in their current state, so we expect few other habitats would be built beyond possible science and exploration outposts in the mid-term. If planet-scale terraforming becomes feasible, mostly by blocking excess sunlight, non-industrial habitats may develop in the long-term.
==='''9.4 - Phase 5D: Jupiter System Locations'''===
 
 Development of the '''[https://en.wikipedia.org/wiki/Jupiter Jupiter System]''' would likely follow the Mid-Interplanetary (Section 8.5), as its orbit is near the outer edge of that region. It isn't clear if the Jupiter region will be easier or harder to develop than Venus and Mercury.
:'''Jupiter System Features'''
 The Jupiter System includes the largest planet in the Solar System (317.8 Earth masses), and reasonably stable orbits around it with semi-major axes less 25 million km. It includes four '''[https://en.wikipedia.org/wiki/Galilean_moons Galilean Moons]''' more than 3000 km diameter, named as a group after their discoverer. As of 2023 there are 91 known '''[https://en.wikipedia.org/wiki/Moons_of_Jupiter Smaller Moons]''' from 1-170 km in size. The larger moons can support their own reaxonably stable orbits, and can be used for gravity assists to change orbits in the Jupiter system.
 Solar flux varies from 3.3-4.1% of that near Earth, so concentrating reflectors are useful in this region. Escape velocity is 59.5 km/s from just above the atmosphere, or an added 24.6 km/s from low orbit. Escape is 3.11 km/s from the edge of the region. Orbit periods range from 174 minutes to 2.26 years. Travel time from Earth by minimum energy orbit is 2.7 years, while gravity assists and other propulsion methods can increase or decrease the time. Ping time is 1.06 to 1.85 hours, depending on relative orbit locations.
 Jupiter has a strong magnetic field which creates intense radiation belts. This ranges from high to immediately deadly levels for unprotected people, and can rapidly degrade even shielded electronics. Outside these belts, the usual solar and galactic radiation is still a hazard. Temperature in Jupiter System orbits are about 217K (-56 C) for black objects, and less for lighter colored ones. Jupiter is a Gas Giant, and therefore has no solid surface. The atmosphere is 90% Hydrogen, 10% Helium, plus trace gases. Orbit minus rotation velocity is 29.5 km/s, making it very difficult to access the planet itself or even mine the atmopshere from orbit.
 The four large moons (Io, Europa, Ganymede, and Callisto) orbit 0.422, 0.671, 1.07, and 1.88 million km from Jupiter in nearly circular orbits. They have a combined surface area of 232.8 million km^2, or 1.56 times the land area of Earth. They have negligible atmospheres. All four are tidally locked to Jupiter, so their days are equal to their orbit periods of 1.77, 3.55, 7.15, and 16.7 days. Surface gravity varies from 1.23 to 1.80 m/s^2, or 12.5 to 18.4% of Earth.
 Io's surface is volcanic deposits and sulfur compounds. The other three large moons are either entirely or partially covered in ice, with various minerals and frozen compounds making up the rest of their surfaces. Surface temperatures of the large moons range from 70-165K, except for volcanic hot spots on Io, and vary mostly by latitude and how close they are to Jupiter, which determines how much reflected light they get on the near side.
:'''Economic Uses'''
 Use of the Jupiter System would likely follow the Main Belt and Trojan locations in Phase 4D. There are 12,500 Jupiter Trojans vs 91 smaller moons around Jupiter, and the Trojans are much larger in total mass. Since Jupiter's gravity well requires more velocity to navigate, there is no particular reason to use the smaller moons except as a way to access the larger ones. The outer Jovian moons are likely captured asteroids, and are the same Solar distance as the Trojan group. So they don't represent new technical challenges.
 The large moons together have 6.6% of Earth's mass, or 5.4 times that of Earth's Moon. They can be a very large source of materials, with some significant variations in composition. Early uses are likely to be mining-based, with return of materials to more developed regions. Even the largest moon, Ganymede, has a low enough orbit velocity that a catapult or skyhook can deliver directly to orbit, after which an electric tug can transport it elsewhere. Water is widely available in the Jupiter System, both for life support and propellant. High radiation close to the planet requires careful design for habitats and electronics. Remote control from a safe distance is a possibility.
:'''Jupiter System Transport'''
 Transport from the Mid-Interplanetary region and closer to Earth can start with electric propulsion, and for people use shielded habitat modules. High-thrust landers can be used to start with for the large moons, while skyhooks and catapults can be brought or built later for higher efficiency. Since these would already be developed for previous locations, not much new design would be needed except for radiation protection close to the planet. Transfer habitats in cyclic orbits with heavily shielded sections is a design option. Those sections are used when when close to the planet. We don't expect to land on or mine Jupiter itself until far in the future because of the extremely high energy required. The other Gas Giants are easier to access and have milder radiation belts.
:'''Jupiter System Production'''
 Growth of local production follows the usual path of mining first, then bringing seed factory equipment to bootstrap other industries. The smaller outer moons can be an early source of fuel and water. Rocky and metallic materials may need to be imported from the surrounding regions, depending on the composition of the moons. Large reflectors would be a desirable early product to generate power and heat.
:'''Living in the Jupiter System'''
 Living in the outer parts of the Jupiter system is very similar to the Trojan asteroid regions, as they are the same average distance from the Sun. Only '''[https://en.wikipedia.org/wiki/Callisto_(moon) Callisto]''' among the large moons has tolerable radiation levels at its surface. The closer moons and orbits around and among them require significant shielding. Water is a good shielding material, and all the large moons have lots of it.
==='''9.5 - Phase 5E: Outer Giant Locations'''===
 
 The three outer giant planets, '''[https://en.wikipedia.org/wiki/Saturn Saturn]''', '''[https://en.wikipedia.org/wiki/Uranus Uranus]''', and '''[https://en.wikipedia.org/wiki/Neptune Neptune]''', are next in difficulty from distance and lower solar energy. This is compensated somewhat by lower masses than Jupiter, so smaller velocity changes are needed to work around.
:'''Outer Giant Features'''
 The three planets average 9.55, 19.22, and 30.11 AU from the Sun. These planets and their orbital regions are embedded in the Outer Interplanetary region of Phase 4E (Section 8.6). Saturn's orbital region extends 30 million km from the planet center, and includes 83 '''[https://en.wikipedia.org/wiki/Moons_of_Saturn Known Moons]''' as of 2023. Eleven of these moons are larger than 100 km, of which five (Tethys, Dione, Rhea, Titan, and Iapetus) are larger than 1,000 km, with Titan being 5,150 km in diameter (75% of Mars).
 Uranus' region is 24 million km in radius, and has 27 known '''[https://en.wikipedia.org/wiki/Moons_of_Uranus Moons]'''. Five of them (Miranda, Ariel, Umbriel, Titania, and Oberon) are considered major, ranging from 470 to 1575 km in diameter. Neptune's region is 50 million km radius, and has 14 known '''[https://en.wikipedia.org/wiki/Moons_of_Neptune Moons]''', of which Triton is by far the largest at 2700 km diameter. The larger moons of all three can support stable orbits and enable gravity assists. All the giant planets, including Jupiter, have ring systems. Saturn's is the most massive at an estimated 30 million Gigatons, almost as much as the 400 km moon Mimas, which orbits nearby.
 Solar energy is weak in these regions, about 1%, 1/4%, and 1/9% of that near Earth. Large reflectors would be needed to bring sunlight to useful levels. Nuclear power may be more effective. Escape velocities are 35.5, 21.3, and 23.5 km/s from each planet, and 1,535, 682, and 255 m/s from the edge of their regions. Orbit periods are vary from 250, 180, and 155 minutes close to the planets, to 3.8, 9.9, and 27 years at the edge. Travel times are 6, 16, and 30 years by minimum energy orbits. Gravity assists and added propulsion can shorten the trips.
 Ping times average 2.65, 5.33, and 8.35 hours, plus or minus about 20 minutes for relative planetary positions. Radiation levels around Saturn are about as high as Earth's Van Allen Belts, so added shielding is needed for people and electronics. It is most intense between the ring system and the moon Enceladus. Radiaition around Uranus and Neptune are lower, but still include the solar and cosmic background flux present in most parts of the Solar System.
 Like Jupiter, the outer Giants have no solid surface. Their atmospheres get denser with depth until they are beyond the '''[https://en.wikipedia.org/wiki/Critical_point_(thermodynamics) Critical Point]''' and reach liquid density and higher. The upper portions are 96% hydrogen, 3% helium for Saturn; 83% hydrogen, 15% helium, and 2.3% hethane for Uranus; and 80% hydrogen, 19% helium, and 1.5% methane for Neptune. All three have small amounts of trace gases. Orbit minus planet rotation velocities are 15.2, 12.5, and 13.9 km/s. Scoop mining their atmospheres would be hard, but should be feasible.
:'''Economic Uses'''
 The outer Giant regions are too far for near-term use. Their development could start once the Outer Interplanetary region around them is accessible. The first use is likely to be mining various raw materials. The combined total of 124 moons and one major ring system around these planets have a mass of 1720 x 10<sup>20</sup> kg, or 2.34 times the Moon. This is a very large source of materials, but their distance means mining them will be delayed. Mined material would likely be brought back back to inner regions where there is more energy for processing and projects that need them. Other uses besides mining are too far in the future to predict right now.
 Titan has a thick Nitrogen atmosphere (1.4 times Earth pressure) with 1.4% Methane at upper levels and 4.9% at lower levels. Low orbits are about 1.8 km/s, so scoop-mining this atmosphere is particularly easy. Helium-3 has been proposed as a low radiation fusion fuel. Fusion in general has not yet been solved, and the He-3 reaction is 10 times harder than deuterium-tritium (D-T), which is the main target of current research.
 If either kind of fusion becomes feasible, scoop-mining the outer Giant atmospheres may become economic because of its high energy output, and the light gases also make good propellants. All three giants have deuterium, and Uranus and Neptune have the highest concentrations of Helium in their atmospheres, and thus the He-3 isotope. The easier D-T fusion should enable trips to these planets in reasonable time.
:'''Outer Giant Transport'''
 Chemical rockets have sent probes to the outer planets, but this is very inefficient. As in other regions, gravity assists from massive bodies, surface catapults, and skyhooks can be used to improve transport efficiency. Solar power has been used for probes as far as Jupiter and its Trojan asteroids, but reflectors to increase power for propulsion in farther regions hasn't yet been developed. Current work is on small fission reactors for a variety of uses, including nuclear-electric propulsion, which would be much more efficient than chemical.
 Fission and fusion fuels have high energy content but the reactors to use them tend to be higher mass than solar power. The also emit harmful radiation, but most parts of the Solar System are already filled with it anyway. The same shielding can protect from both sources. Nuclear fuels are also relatively rare compared to silicon used for solar cells or aluminum/magnesium alloy for concentrating reflectors. It isn't clear what the best energy source for future propulsion will be.
:'''Outer Giant Production and Living'''
 We don't expect activities beyond science, exploration, and mining in these regions until technology improves significantly from current levels. Since we can't predict what improvements will be made in the long-term, we will leave what local production and habitation is possible as an open question.
=='''10.0 - Interstellar Locations'''==
 
 The last major phase of our program involves interstellar locations. The key difference that warrants a new phase is the extreme distances involved. This breaks the ability to deliver things from the Solar System and communicate with it in a reasonable time. Deveopment of these locations would require high self-sufficiency in transport, enough starting materials, and self-improving systems capable of growth without outside assistance.
 Phase 6 projects are far enough in the future that we can only speculate about them in general terms. We include it mainly as a place-holder and to give direction for future long-term work. We divide it into two sub-phases - the spaces between stars, and those around other star systems. Since you must cross interstellar space before reaching the other systems, logically the sub-phases are in that order.
==='''10.1 - Phase 6A: Interstellar Space Locations'''===
 
:'''Interstellar Features'''
 We define the Interstellar region as starting 100,000 AU from the Sun, where nearby stars and the Milky Way galaxy as a whole begin to contest the Sun's gravity. There is no outer limit for this region beyond whatever travel distances are possible from future technology. Since we don't know what those future technologies will be, for now we will arbitrarily set a boundary of 20 light years from the Sun.
 Probably the most significant feature of this region is that star systems are all in relative motion to each other, with an average velocity of 50 km/s. This is on top of the general rotation of the galaxy at about 225 km/s. As of 2023 there are 131 known '''[https://en.wikipedia.org/wiki/List_of_nearest_stars_and_brown_dwarfs Stars and Brown Dwarfs]''' in the 20 light year "Solar Neighborhood". Given their average velocity, they will travel 20 light years in 120,000 years, so the membership of the neighborhood will change about every 1250 years on average.
 The local interstellar region is very low density gas, at ~0.3 atoms per cubic centimeter, or 1 gram per 564 km cube. That does not include cometary clouds around stars, or wandering objects between them. We know very little about such smaller objects, but assume some exist by similarity to our own Solar System.
 The Interstellar environment between stars is not much different from distant orbit environments in Phase 4F (Section 8.7). Stellar energy is effectively zero, and while stellar radiation is not a factor in this region, cosmic radiation still is.
:'''Economic Uses'''
 We don't know enough about material resources and energy sources in this region to propose economic uses. The distance to the Sun detaches any industries from regular trade with the rest of civilization. Science, exploration, and seeding interstellar colonies are possible long-term activities.
:'''Interstellar Transport'''
 Interstellar transport can be divided into slow and fast types. The slow type is on the order of stellar velocities (5-500 km/s). An example is a large habitat with large material reserves and fusion power as an energy source. It can subsist on the cometary clouds around stars and unbound objects between them. When it gets close enough to a selected star, it can enter orbit and travel with it. Such habitats would be based on previous space habitats in the Solar System, so it doesn't require a lot of new development.
 Travel times between stars at these speeds would average 3000 years or longer. Such times are long enough that technology changes during the trip are a factor. Trying to reach a specific star doesn't make unless technology had reached a plateau or making improvements in transit was planned for. If the habitat is considered a permanent place to live that happens to be moving to access new resources, speed of travel is less of an issue.
&emspFast interstellar puts much more energy into transportation, to reach higher velocities and shorten time to a destination. Possible methods include fusion-powered engines and beamed power using the Sun as a gravitational lens for focus. Rather than a large habitat with a full range of civilized activity, fast interstellar operates more like ships on Earth, with a crew dedicated to reaching a destination and maintaining operations. We don't yet know what interstellar transport methods will prove feasible, if any, and the other space-related technologies available by then, so this is all speculative for now.
:'''Interstellar Production'''
 We don't know enough about resources in this region to consider gathering raw materials. So the only production we can plan for now is what they bring with them. If they start with a large reserve, such as a captured comet nucleus, it can be used for supplies, maintenance, and upgrades.
==='''10.2 - Phase 6B: Stellar Locations'''===
 
:'''Stellar System Features'''
 We define stellar regions as those surrounding individual stars, brown dwarfs, or multi-object systems, of which there are 94 within 20 light years. The size of the regions are scaled to the square root of the system mass divided by Sun's mass, times 100,000 AU. This is their region of gravitational dominance and any cometary cloud bound to them.
 Stars and brown dwarfs are bright enough to find with current equipment. In fact 22 star systems within 20 light years can be seen from a dark location on Earth without optical aid. We have basic information about planets and disks around other stars. Their parent stars tell us where to look, and the stars themselves provide data about the planets from Doppler shifts and transits.
 The number of discovered planets at all distances is growing rapidly, from none before 1988 to about 2000 by the end of 2015, and over 5000 by 2023. 59 of them are within 20 light years. Dust and gas in '''[https://en.wikipedia.org/wiki/Circumstellar_disc Disks]''' around younger stars are visible to current telescopes, but none are within 20 light years. Two nearby star systems, epsilon Eridani and Tau Ceti, are known to have longer-lived debris disks.
:'''Economic Uses'''
 Due to extreme distance, the only economic uses we see for now are science, exploration, and seeding independent colonies. More study is needed with better telescopes before any attempt to plan travel to these stars.
:'''Exostellar Transport'''
 Transport between stars is covered under Phase 6A in the previous section. Travel within a given stellar region would use the same technologies as around the Sun, with modifications for available energy sources.
:'''Exostellar Production'''
 As mentioned earlier, we would want to observe the nearby stars in more detail by using the Sun as a giant gravitational lens. Following that would likely be robotic probes to more closely examine whatever is found around these stars. A self-bootstrapping seed factory approach should work at other stars, since the properties of energy and matter are the same everywhere. However the details will depend on what resources are available.
</div>
fe9u9fexnfplyn9dy6x4ayext99b52o
Wikibooks:Edit filter/False positives
4
396216
4669622
4665470
2026-09-10T17:50:58Z
~2026-49041-81
3625649
/* {{subst:currentuser}}{{subst:^|DO NOT EDIT THIS LINE}} */ new section
4669622
wikitext
text/x-wiki
__NONEWSECTIONLINK__ __NOINDEX__ {{Wikibooks:Edit filter/False positives/Header}} {{shortcut|WB:EFFP}} {{User:MiszaBot/config
|archive = Wikibooks:Edit filter/False positives/Archive %(counter)d
|algo = old(75d)
|counter = 4
|maxarchivesize = 150K
|minthreadstoarchive = 1
|minthreadsleft = 3
}}
== ~2026-35089-83 ==
;Username
: [[:b:User:~2026-35089-83|~2026-35089-83]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:~2026-35089-83|discuss]]
|[[:b:Special:Emailuser/~2026-35089-83|email]]
|[[:b:Special:Contributions/~2026-35089-83|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:~2026-35089-83}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:~2026-35089-83}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=%7E2026-35089-83}} filter log]</span>)
;Page you were editing
: [[[[Japanese/Kana]]]] <span class="plainlinks">([{{fullurl:Special:AbuseLog|wpSearchTitle=%5B%5BJapanese%2FKana%5D%5D}} filter log]) ([{{fullurl:Special:AbuseLog|wpSearchTitle=%5B%5BJapanese%2FKana%5D%5D&wpSearchUser=%7E2026-35089-83}} user filter log])</span>
;Description
: Tried replacing a dead link with a working version I found when I plugged the link into webarchive, since that's what I presumed I was meant to do when I found a dead link.
;Date and time
: 01:27, 15 June 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
: {{EFFP|done}} – [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 21:54, 15 July 2026 (UTC)
== SeaDragon1 ==
;Username
: [[:b:User:SeaDragon1|SeaDragon1]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:SeaDragon1|discuss]]
|[[:b:Special:Emailuser/SeaDragon1|email]]
|[[:b:Special:Contributions/SeaDragon1|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:SeaDragon1}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:SeaDragon1}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=SeaDragon1}} filter log]</span>)
;Page you were editing
: [[User:SeaDragon1/UTM highlighting test]] <span class="plainlinks">([{{fullurl:Special:AbuseLog|wpSearchTitle=User%3ASeaDragon1%2FUTM+highlighting+test}} filter log]) ([{{fullurl:Special:AbuseLog|wpSearchTitle=User%3ASeaDragon1%2FUTM+highlighting+test&wpSearchUser=SeaDragon1}} user filter log])</span>
;Description
: Attempted creation of page to test [[User:SeaDragon1/common.js]] (both attempted page creation content and <span style="font-family: monospace">common.js</span> were copied from [[w:Main Page|the English Wikipedia]]).
;Date and time
: 23:26, 3 July 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
:{{EFFP|ad|SeaDragon1}} [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 16:40, 16 July 2026 (UTC)
== Earthinators ==
;Username
: [[:b:User:Earthinators|Earthinators]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:Earthinators|discuss]]
|[[:b:Special:Emailuser/Earthinators|email]]
|[[:b:Special:Contributions/Earthinators|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:Earthinators}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:Earthinators}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=Earthinators}} filter log]</span>)
;Page you were editing
: [[Earthinators]] <span class="plainlinks">([{{fullurl:Special:AbuseLog|wpSearchTitle=Earthinators}} filter log]) ([{{fullurl:Special:AbuseLog|wpSearchTitle=Earthinators&wpSearchUser=Earthinators}} user filter log])</span>
;Description
: I was trying to replace the main page of [[Earthinators]] with a neutral, instructional textbook version ([[Talk:Earthinators|the new text is on the talk page]]). The edit filter blocked me, saying the edit was "potentially unconstructive". The new version follows Wikibooks guidelines – it’s a textbook, not a promotional page. Please allow the edit or make the change for me.
;Date and time
: 06:56, 11 July 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
:{{EFFP|rf}} [[User:Codename Noreste|Codename Noreste]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 19:48, 16 July 2026 (UTC)
== ~2026-40102-72 ==
;Username
: [[:b:User:~2026-40102-72|~2026-40102-72]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:~2026-40102-72|discuss]]
|[[:b:Special:Emailuser/~2026-40102-72|email]]
|[[:b:Special:Contributions/~2026-40102-72|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:~2026-40102-72}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:~2026-40102-72}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=%7E2026-40102-72}} filter log]</span>)
;Page you were editing
: Page not specified
;Description
:
;Date and time
: 20:26, 15 July 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
:{{EFFP|nft}} [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 16:39, 16 July 2026 (UTC)
== ~2026-40102-72 ==
;Username
: [[:b:User:~2026-40102-72|~2026-40102-72]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:~2026-40102-72|discuss]]
|[[:b:Special:Emailuser/~2026-40102-72|email]]
|[[:b:Special:Contributions/~2026-40102-72|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:~2026-40102-72}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:~2026-40102-72}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=%7E2026-40102-72}} filter log]</span>)
;Page you were editing
: Page not specified
;Description
:
;Date and time
: 20:27, 15 July 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
:{{EFFP|nft}} [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 16:39, 16 July 2026 (UTC)
== LoveElectronicLiterature ==
;Username
: [[:b:User:LoveElectronicLiterature|LoveElectronicLiterature]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:LoveElectronicLiterature|discuss]]
|[[:b:Special:Emailuser/LoveElectronicLiterature|email]]
|[[:b:Special:Contributions/LoveElectronicLiterature|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:LoveElectronicLiterature}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:LoveElectronicLiterature}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=LoveElectronicLiterature}} filter log]</span>)
;Page you were editing
: [[https://en.wikibooks.org/w/index.php?title=Hereditary_Multiple_Exostoses&veaction=edit§ion=7]] <span class="plainlinks">([{{fullurl:Special:AbuseLog|wpSearchTitle=https%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DHereditary_Multiple_Exostoses%26veaction%3Dedit%26section%3D7}} filter log]) ([{{fullurl:Special:AbuseLog|wpSearchTitle=https%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DHereditary_Multiple_Exostoses%26veaction%3Dedit%26section%3D7&wpSearchUser=LoveElectronicLiterature}} user filter log])</span>
;Description
: I was trying to copy the references and abstracts that I have been maintaining for over 20 years at http COLON SLASH SLASH tinyurl DOT com SLASH MHETalk. I copied a bunch of references, and then I shortened the description and put the citations in. But I got flagged for copying. Is there any way to fix this? thanks!
;Date and time
: 16:23, 16 July 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
: {{EFFP|notdone}} You attempted to add a large edit to a book, so please try doing this in smaller edits. – [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 01:52, 15 August 2026 (UTC)
== Madan Bibhishan Nagargoje ==
;Username
: [[:b:User:Madan Bibhishan Nagargoje|Madan Bibhishan Nagargoje]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:Madan Bibhishan Nagargoje|discuss]]
|[[:b:Special:Emailuser/Madan Bibhishan Nagargoje|email]]
|[[:b:Special:Contributions/Madan Bibhishan Nagargoje|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:Madan Bibhishan Nagargoje}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:Madan Bibhishan Nagargoje}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=Madan+Bibhishan+Nagargoje}} filter log]</span>)
;Page you were editing
: Page not specified
;Description
:
;Date and time
: 06:15, 22 July 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
:This was correctly prevented because you were trying to add a link to a Google Drive file as a "reference". If you are genuinely trying to add a reference, do this to a publicly available source and not a private Drive file. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:52, 13 August 2026 (UTC)
== ~2026-44191-83 ==
;Username
: [[:b:User:~2026-44191-83|~2026-44191-83]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:~2026-44191-83|discuss]]
|[[:b:Special:Emailuser/~2026-44191-83|email]]
|[[:b:Special:Contributions/~2026-44191-83|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:~2026-44191-83}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:~2026-44191-83}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=%7E2026-44191-83}} filter log]</span>)
;Page you were editing
: [[An_Introduction_to_Dragon]] <span class="plainlinks">([{{fullurl:Special:AbuseLog|wpSearchTitle=An_Introduction_to_Dragon}} filter log]) ([{{fullurl:Special:AbuseLog|wpSearchTitle=An_Introduction_to_Dragon&wpSearchUser=%7E2026-44191-83}} user filter log])</span>
;Description
: Adding/expanding book content (introduction, table of contents, and lesson pages) for the Dragon programming language wikibook, based on the project's own source code and documentation. No spam or promotional intent.
;Date and time
: 08:15, 11 August 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
:The edit was flagged as it deleted a large amount of content in one go, a typical fingerprint of non-constructive editing. I can see your edit was constructive and I recommend you make your changes using smaller edits initially. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 11:50, 13 August 2026 (UTC)
== ~2026-49041-81 ==
;Username
: [[:b:User:~2026-49041-81|~2026-49041-81]]<span class="noprint"> {{toolbar|separator=dot
|[[:b:User talk:~2026-49041-81|discuss]]
|[[:b:Special:Emailuser/~2026-49041-81|email]]
|[[:b:Special:Contributions/~2026-49041-81|contribs]]
|[{{fullurl:b:Special:Log|user={{urlencode:~2026-49041-81}}}} <span style{{=}}"color:#002bb8">logs</span>]
|[//tools.wmflabs.org/xtools/pcount/index.php?lang{{=}}en&wiki{{=}}wikibooks&name{{=}}{{urlencode:~2026-49041-81}} <span style{{=}}"color:#002bb8">count</span>]
}}</span> (<span class="plainlinks">[{{fullurl:Special:AbuseLog|wpSearchUser=%7E2026-49041-81}} filter log]</span>)
;Page you were editing
: [[Danish]] <span class="plainlinks">([{{fullurl:Special:AbuseLog|wpSearchTitle=Danish}} filter log]) ([{{fullurl:Special:AbuseLog|wpSearchTitle=Danish&wpSearchUser=%7E2026-49041-81}} user filter log])</span>
;Description
: Tried to add this link to my-danish-tutor.com This one has a ton of free resources and interactive materials for learning Danish. Reading, listening, conversations, grammar, word lists, flashcards and much more.
;Date and time
: 17:50, 10 September 2026 (UTC)
;Comments
<!-- Please leave this area blank for now, but be prepared to answer questions left by reviewing editors. Thanks! -->
210ufzgxti6vhm0nkuz7kkm1ccn7hin
Exercise as it relates to Disease/Exercise as a means to reduce hospital admission and respiratory mortality due to COPD
0
401749
4669566
3469976
2026-09-10T12:47:19Z
WereSpielChequers
248949
typo
4669566
wikitext
text/x-wiki
This is an analysis of the journal article "Regular physical activity reduces hospital admission and mortality in chronic obstructive pulmonary disease: a population based cohort study" <ref name="zero”>”J Garcia-Aymerich, P Lange, M Benet, P Schnohr, J M Antó. Regular physical activity reduces hospital admission and mortality in chronic obstructive pulmonary disease: a population based cohort study. Thorax 2006; 61 739-739 Published Online First: 25 Aug 2006. doi: 10.1136/thx.2006.awsep06</ref>.
=='''Background'''==
Chronic Obstructive Pulmonary Disease (COPD) is one of the leading causes of morbidity and causes of death around the world <ref name="one">"Murray CJL, Lopez AD. Alternative projections of mortality and disability by cause 1990–2020: Global Burden of Disease Study. Lancet1997;349:1498–504</ref>.
COPD affects 6-7% of adults <ref name=">two"Mannino DM, Homa DM, Akinbami LJ, et al. Chronic obstructive pulmonary disease surveillance – United States, 1971–2000. MMWR2002;51:1–16"</ref>.
COPD is a group of lung diseases that block airflow to the lungs making it difficult to breathe. Reduced airflow and oxygen absorption can affect day-to-day life and physical activity participation.
Unfortunately, information derived from research in relation to regular physical activity and its effect on COPD is scarce.
Current popular guidelines for physical activity for COPD patients is produced by the British Thoracic Society <ref name="three">"COPD Guidelines Group of the Standards of Care Commitee of the BTS. BTS guidelines for the management of chronic obstructive pulmonary disease. Thorax1997;52 (Suppl 5) :S1–28</ref>. However the authors of this study state these guidelines do not provide any evidence / research to support them.
For other health conditions such as cancer and Type 2 diabetes, there is significant amounts of research showing higher levels of physical activity (3-5 hours of walking equivalent per week) reduced related risks <ref name="four”>”Di Loreto C , Fanelli C, Lucidi P, et al. Make your diabetic patients walk: long-term impact of different amounts of physical activity on type 2 diabetes. Diabetes Care2005;28:1295–302</ref><ref name="five”>”Schmitz KH, Holtzman J, Courneya KS, et al. Controlled physical activity trials in cancer survivors: a systematic review and meta-analysis. Cancer Epidemiol Biomarkers Prev2005;14:1588–95</ref>.
=='''Where is the research from?'''==
The COPD study in question takes a relevant cohort of adults involved in the much larger Copenhagen City Heart Study (CCHS). The CCHS, which commenced in 1976-8, provided relevant historical information for the cohort selected, including the course of COPD.
Funding is provided for the CCHS and grant funding was also provided for the COPD study. The COPD study states the funding did not affect the design and conduct of the research.
The lead author of the paper, Dr J Garcia-Aymerich, is well known for publishing over 100 peer reviewed scientific papers and working with committees tasked with developing international policies on pulmonary rehabilitation.
=='''Study design'''==
The COPD study is a population based cohort study meaning a defined population is followed to determine relationships to risk factors and outcomes.
=='''What did the research involve?'''==
The study participants were a cohort of 2,386 subjects. These participants had originally been recruited to the CCHS from the general population aged 20 years or older. As part of the CCHS, they had undergone repeated examination every 5-10 years. The cohort of participants qualified to be part of the COPD study if they met the criteria for COPD. COPD was defined on the basis of forced expiratory volume in 1 second (FEV<sub>1</sub>) and forced vital capacity FVC with COPD defined as FEV<sub>1</sub>/FVC <big><big>⩽</big></big> 70%. The participants were further classified into 4 categories by the degree of airway obstruction as detailed in the table below.
{| class="wikitable"
|-
!Category !!FEV<sub>1</sub>
|-
| Mild || <big><big>⩾</big></big>80%
|-
| Moderate || <80% and <big><big>⩾</big></big>50%
|-
| Severe || <50% and <big><big>⩾</big></big>30%
|-
| Very Severe || <30%
|}
Participants completed a self-administered questionnaire on regular physical activity over the previous 12 months. Details were also obtained of:
* current smoking and alcohol consumption;
* socioeconomic factors (sex, age, education, marital status, cohabitation, income);
* current symptoms (dyspnoea, sputum, chest pain, leg pain and intermittent claudication); and
* any diagnosis of co-morbidity (asthma, ischaemic heart disease, myocardial infarction, stroke, diabetes); and
CCHS staff also provided details of the participants’ health service use over the previous 12 months.
Blood pressure, plasma cholesterol, glucose concentrations, and body mass index were also measured and clinical records were reviewed to obtain information about co-morbidity.
The physical activity questionnaire was originally developed by Saltin and Grimby <ref name="6”>”Saltin B , Grimby G. Physiological analysis of middle-aged and old former athletes: comparison with still active athletes of the same ages. Circulation1968;38:1104–15</ref> and has been used in many other studies involving similar populations to describe health outcomes.
The level of physical activity was classified in accordance with the below table.
{| class="wikitable"
|-
! Category !! Physical activity
|-
| Very low || No physical activity including mainly sitting at work
|-
| Low || Light activity less than 2 hours/week
|-
| Moderate || Light activity for 2-4 hours/week
|-
| High || Light activity for more than 4hours/week or more vigorous activity for any frequency
|}
Lung function parameters (FEV<sub>1</sub> and FVC) were measured three times with the highest measurements of FEV<sub>1</sub> and FVC used in the analysis. Hospital admissions before the start and during the study were obtained as well as causes of death.
A statistical analysis of the data was then undertaken. The analysis took into account the other variables such as COPD severity, age, sex and history of heart disease.
=='''What were the basic results?'''==
[[File:Kaplan-Meier curve mortality.jpg|thumb|Click to enlarge]]
The 20 year follow up COPD study results showed that physical activity equivalent to walking of cycling for 2 hours/week or more resulted in a 30-40% reduction in the risk of COPD related hospital admission and respiratory mortality. The participant’s sex, age group, COPD severity or background ischaemic heart disease did not affect this outcome.
The graph to the right is a Kaplan-Meier curve regarding physical activity. Graph A shows time to first COPD hospital related admission during the follow up. Graph B shows time to death (all cause mortality).
After adjusting for cofounders participants reporting low, moderate, or high levels of physical activity had a lower risk of a COPD admission than those reporting a very low level of physical activity.
=='''What conclusions can we take from this research?'''==
Results show that having at least a low level of light physical activity decreases negative outcomes associated with COPD. As the level of light physical activity increases, further reductions in negative outcomes were observed. The type of physical activity required to significantly reduce negative outcomes together with the the activity not requiring specialist supervision makes these findings particularly promising.
The significance of COPD prevalence creates a large socioeconomic burden and results in negative health consequences. Given this, future guidelines for COPD should recommend people with COPD maintain or increase physical activity levels as this is likely to result in improvements for the person as well as overall public health benefits.
Future studies could look at exercise type, frequency, duration and intensity more accurately to guide the public and healthcare providers further.
=='''Practical advice'''==
Any person who has been diagnosed with COPD should be strongly encouraged to undertake at least 2 hours per week of light physical activity. This activity could take the form of walking or cycling, which can be achieved at little or no financial cost.
Where motivation is an issue, it may be joining a group of walkers or cyclists could assist. The inclusion of family members and/or friends in the activity may also result in more consistent participation, as well as increasing the enjoyment of the activity.
=='''Further resources'''==
Exercise tips for people with COPD: my.clevelandclinic.org/health/articles/9450-copd-exercise--activity-guidelines
All things COPD: www.copdfoundation.org/Learn-More/I-am-a-Person-with-COPD/Exercise.aspx
=='''References'''==
{{BookCat}}
fq21gw9dpgqraesleg3tcevlxy8snxb
User talk:Kaiser Kitkat
3
412328
4669599
3627352
2026-09-10T13:00:53Z
MathXplore
3097823
Requesting deletion ([[:m:Special:MyLanguage/User:TenWhile6/XReport|XReport]] v3.1c)
4669599
wikitext
text/x-wiki
<noinclude>{{delete|1=Broken redirect <small>[[:m:Special:MyLanguage/User:TenWhile6/XReport|XReport]]</small>}}</noinclude>
#REDIRECT [[User talk:Emicho's Avenger]]
a0igq246dtv8q12imweup8p1949ubi5
User:Kaiser Kitkat
2
412329
4669598
3627353
2026-09-10T13:00:46Z
MathXplore
3097823
Requesting deletion ([[:m:Special:MyLanguage/User:TenWhile6/XReport|XReport]] v3.1c)
4669598
wikitext
text/x-wiki
<noinclude>{{delete|1=Broken redirect <small>[[:m:Special:MyLanguage/User:TenWhile6/XReport|XReport]]</small>}}</noinclude>
#REDIRECT [[User:Emicho's Avenger]]
5st8fltlmo8f70sernp95s7lfgb9t6g
Create Vampires/Scientific Evidence For Vampires
0
415710
4669601
4114669
2026-09-10T13:43:12Z
WereSpielChequers
248949
c/e
4669601
wikitext
text/x-wiki
== Scientific Evidence For Vampires ==
<br>
Are there people, Scientist, who argue for the actual existence of vampires? <br>
<u>Is there evidence that supports their claims?</u> <br>
<br>
Online, many readers can access information about '''<u>Porphyria</u>''', also known as the "vampire disease." From tales of people living with, and finding treatments for their "vampire disease," to horrific stories told about actual people who became victims of grave-robbers, people who were exposed to a unknown drug that left them in coma-like states of unconsciousness, stiff and unable to respond to their close relatives. These grave tales generate fear in people, and lingering doubt in the ability of trained Medical professionals who, according to stories, <u>seem to not know how</u> to properly use a mirror to determine if a person is breathing, and thus alive and unconscious, or is non-breathing, thus dead, having taken their final breath, having met their final hour.
Although Scientific evidence for people with both mental, and physical "vampire-related" diseases accumulated rapidly in the early 1980s, the Scientific classification for particular drugs that cause stiff, deep unconscious states, are less known and currently not popular in the public domain.
<br>
Link: [[Create_Vampires/Scientific_Evidence_Against_Vampirism]]<br>
<br>
{{BookCat}}
i811nruocj9goia6j67n1h87zrmrwo2
Mirad Grammar
0
417631
4669613
4637068
2026-09-10T15:36:24Z
Tyoyafud
6233
4669613
wikitext
text/x-wiki
{{Alphabetical|M}}
{{shelves|Mirad}}
{{status|100%}}
{{Chapter navigation with TOC||Introduction|}}
{{print version|Mirad Grammar/print version|(No dictionary)|Mirad Grammar}}
{{Book search | style=image}}
<small>
Welcome to a textbook on the grammar of <big><b>Mirad</b></big>. Formerly known as '''Unilingua''', Mirad is an artificially constructed auxiliary language ([[Constructed language|conlang]]) developed originally by Paris-based author Noubar Agopoff [https://books.google.com/books/about/Unilingua.html?id=I7ghxwEACAAJ] as a ''serious'' medium for easy, regular, expressive, and logical international communication. This textbook is a revision of the language with many new features, plus access to a bilingual dictionary containing over 150,000 word/expression pairings, over ten times the size the original Unilingua vocabulary. The vocabulary is internally consistent and was developed systematically from scratch with no relation to existing natural languages except for a few universal words like "karaoke" or "falafel".
</small>
[[File:The Earth seen from Apollo 17.jpg|thumb|left|'''Yubjo, ha mir gonbio yansauna gabyuxea dalzeyn.''' (''Soon, the world will share a common auxiliary language.'')]]
{| class="wikitable" style="font-size:smaller; margin: 0 auto;"
|+ Table of Contents
|-
|valign="top"|
* [[/Introduction/]] {{stage short|100%}}
* [[/Why Mirad?/]] {{stage short|100%}}
* [[/Alphabet/]] {{stage short|100%}}
* [[/Pronunciation/]] {{stage short|100%}}
* [[/Syllabification/]] {{stage short|100%}}
* [[/Stress/]] {{stage short|100%}}
* [[/Phonotactics/]] {{stage short|100%}}
* [[/Parts of Speech/]] {{stage short|100%}}
* [[/Nouns/]] {{stage short|100%}}
* [[/Nouns#Modifying Nouns with the Definite Article|Articles]] {{stage short|100%}}
* [[/Adjectives/]] {{stage short|100%}}
* [[/Adverbs/]] {{stage short|100%}}
* [[/Determiners/]] {{stage short|100%}}
* [[/Numbers/]] {{stage short|100%}}
* [[/Pronouns/]] {{stage short|100%}}
* [[/Verbs/]] {{stage short|100%}}
* [[/Prepositions/]] {{stage short|100%}}
* [[/Conjunctions/]] {{stage short|100%}}
|valign="top"|
* [[/Interjections/]] {{stage short|100%}}
* [[/Hybrids/]] {{stage short|100%}}
* [[/Greetings and Euphemisms/]] {{stage short|100%}}
* [[/Acronyms and Abbreviations/]] {{stage short|100%}}
* [[/Onomatopoeia/]] {{stage short|100%}}
* [[/Vocabulary Formation/]] {{stage short|100%}}
* [[/Word Families/]] {{stage short|100%}}
* [[/Syntax/]]{{stage short|100%}}
* [[/Sample Texts Analyzed/]] {{stage short|100%}}
* [[/Lesson 1/]] {{stage short|100%}}
* [[/Lesson 2/]] {{stage short|100%}}
* [[/Lesson 3/]] {{stage short|100%}}
* [[/Lesson 4/]] {{stage short|100%}}
* [[/Lesson 5/]] {{stage short|100%}}
* [[/Mirad-English Dictionary/]] {{stage short|100%}}
* [[/Flaws in Mirad/]] {{stage short|%25}}
|}
7a5b4opftzzi59xhw8f7fwqyqphxwx3
Mirad Grammar/Prepositions
0
417650
4669610
4659506
2026-09-10T15:02:25Z
Tyoyafud
6233
/* Compound Prepositions Using Adverbs */
4669610
wikitext
text/x-wiki
<noinclude>{{status|100%}}</noinclude>
: Prepositions are words that connect and show a relationship between a noun or noun phrase and the rest of the sentence. In Mirad, prepositions are simple monosyllables or phrases. Prepositions, as in English, are positioned before the noun or noun phrase they connect.
== Single-word Prepositions ==
[[File:Prepositions of place.svg|thumb|]]
: In Mirad, there are '''''single-word prepositions''''' and '''''compound prepositions'''''.
: Here is a chart of single-word prepositions. Most are spatial, but some are temporal, relational, or mathematical.
:{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Simple Prepositions
|-
! Positive !! Neutral !! Negative
|-
! colspan="3" | Spatial
|-
| '''ab'''....''on, upon'' || '''eb'''....''between'' || '''ob'''....''off, off of''
|-
| '''ayb'''....''over, above'' || '''eyb'''....''among, amid'' || '''oyb'''....''under, below''
|-
| '''bu'''....''to'' || '''be'''....''at'' || '''bi'''....''from, of''
|-
| '''byu'''....''as far as, up to'' || || '''byi'''....''starting with''
|-
| '''ub'''....''toward'' || || '''ib'''....''away from''
|-
| '''yub'''....''near'' || '''yeb'''....''in, inside''<br>'''oyeb'''....''outside''|| '''yib'''....''far from''
|-
| '''yuz'''....''around'' || '''yez'''....''along'' || '''yiz'''....''beyond''
|-
| '''za'''....''in front of'' || '''ze'''....''at the middle of'' || '''zo'''....''behind, in back of''
|-
| '''zya'''....''throughout'' || '''zye'''....''through'' ||
|-
| || '''zey'''....''across'' ||
|-
! colspan="3" | Temporal
|-
| '''ja'''....''before'' || '''je'''....''during, while'' || '''jo'''....''after''
|-
| '''ju'''....''until'' || || '''ji'''....''since''
|-
! colspan="3" | Relational
|-
| '''av'''....''for'' || '''ev'''....''neither for nor against''<br>'''vyel'''....''than, as, compared to, about'' || '''ov'''....''against''
|-
| '''ayv'''....''about'' || || '''oyv'''....''despite''
|-
| '''ay'''....''and'' || '''ey'''....''or''<br>'''oey'''....''nor'' || '''oy'''....''but, except''
|-
| '''bay'''....''with'' || '''bey'''....''by, via'' || '''boy'''....''without''
|-
| || '''gel'''....''like, as''<br>'''ogel'''....''unlike'' ||
|-
! colspan="3" | Mathematical
|-
| || '''ge'''....''equal to''<br>'''oge'''....''unequal to'' ||
|-
| '''gab'''....''plus, <big>+</big>'' || '''gaob'''....''plus or minus'' || '''gob'''....''minus, <big>-</big>''
|-
| '''gal'''....''times, <big>×</big>'' || || '''gol'''....''divided by, <big>÷</big>''
|-
| '''gar'''....''to the power of, <big>ˆ</big>'' || || '''gor'''....''to the root of, <big>√</big>''
|}
: Some of the above prepositions can be negated by prefixing '''lo'''. For example:
::* '''jo'''....''after'' --> '''lojo'''....''no later than, by''
::* '''ji'''....''since'' --> '''loji'''....''not since''
: The most versatile and useful single-word preposition is '''be''', which means ''at'' as a general locative when used literally, but is used before many nouns and noun phrases when the meaning is idiomatic. Some examples follow:
::* '''Yat se <u>be tam</u>.'''....''We are <u>at home</u>.'' (literal, general locative)
::* '''Yat se <u>be dropek</u>.'''....''We are <u>at war</u>.'' (idiomatic)
::* '''At teata et <u>be yibsin</u>.'''....''I saw you <u>on television</u>.'' (idiomatic)
::* '''<u>Be Ejna York</u> ese mamyabtomi.'''....''<u>In New York</u>, there are skyscrapers.'' (general locative)
::* '''At se <u>be mep</u>.'''....''I am <u>on the way/en route</u>.''
: The preposition '''bi''' can mean ''of'' or ''from''. It is used for possessive (''of'') and ablative (''from'') constructions. Here are some examples:
::* '''Hus se tam <u>bi</u> ifron.'''....''That is a house <u>of</u> worship.''
::* '''At tyopa <u>bi</u> ha nam bu ata pur.'''....''I walked <u>from</u> the store to my car.''
::* '''<u>Bi</u> him bu jobuj.'''....''<u>From</u> here to eternity.''
::* '''Ha tajem <u>bi Tom</u> se him.'''....''<u>Tom's</u> birthplace is here.''
::* '''His sa ha gwaifwa tuzun <u>bi eta teyd</u>.'''....''This was <u>your mother's</u> favorite piece of art.''
=== Simple Preposition Examples ===
::* '''Ha dyes se <u>ab</u> ha sem.'''....''The book is <u>on</u> the table.''
::* '''Von pyosu <u>ob</u> ha abtamas!'''....''Don't fall <u>off</u> the roof!''
::* '''Ha pati papa <u>ayb</u> ata tam.'''....''The birds flew <u>over</u> my house.''
::* '''It kosa <u>oyb</u> ha yagsim.'''....''He hid <u>under</u> the bench.''
::* '''Simbiu <u>eb</u> hut ay at.'''....''Take a seat <u>between</u> that person and me.''
::* '''Yat teje <u>eyb</u> fiati.'''....''We live <u>among</u> good people.''
::* '''Duhos se nax <u>bi</u> pop <u>bu</u> ay <u>bi</u> Boston?'''....''What is the cost <u>of</u> a trip <u>to</u> and <u>from</u> Boston?''
::* '''His se ifek <u>bi</u> kyen.'''....''This is a game <u>of</u> luck.''
::* '''Duven et sa <u>be</u> hua duzun zomoj?'''....''Were you <u>at</u> that concert last night?''
::* '''Yit se embwa <u>be</u> ha zenod bi ha mapil.'''....''We are positioned <u>at</u> the hub of this storm.''
::* '''Iyt tyopa <u>byu</u> ha mes.'''....''She walked <u>up to/as far as</u> the door.''
::* '''Ha twob tojbwa <u>bey</u> goblar.'''....''The man was killed <u>with/by</u> a knife.''
::* '''Et xu ga fiay ser <u>bay</u> at vyel <u>boy</u> at.'''....''You would do better to be <u>with</u> me than <u>without</u> me.''
::* '''Teaxu <u>ib</u> ha amar.'''....''Look <u>away</u> from the sun.''
::* '''Von teaxu iz <u>ub</u> ha man.'''....''Don't look directly <u>toward</u> the light.''
::* '''Yibdaliru <u>ub</u> ha uj bi eta pop.'''....''Call me <u>toward</u> the end of your trip.''
::* '''Emkyoxu eta pur <u>yub</u> ha tam.'''....''Park the car <u>near</u> the house.''
::* '''At voy se <u>yib</u> et.'''....''I'm not <u>far from</u> you.''
::* '''Iyt simpa <u>za</u> at.''' ....''She sat <u>in front of</u> me.''
::* '''Et yeyfe simbier <u>zo</u> hua toyb.'''....''You should sit <u>in back of</u> that woman.''
::* '''Embu has <u>zu</u> ha mis.'''....''Put it <u>to the left of</u> the door.''
::* '''At simpo <u>zi</u> et.'''....''I will sit <u>to the right of</u> you.''
::* '''Ha pat besa <u>ze</u> ha tim.'''....''The bird stayed <u>in the middle of</u> the room.''
::* '''Mil upeye <u>zye</u> ha yijun.'''....''Water is coming <u>through</u> the opening.''
::* '''Bikiu je pen <u>zey</u> ha domep.'''.....''Take care when going <u>across</u> the street.''
::* '''Eso ivan <u>zya</u> ha mir.'''....''There will be happiness <u>throughout</u> the world.''
::* '''His xwo <u>ja</u> zajub.''' ....''This will happen <u>before</u> tomorrow.''
::* '''Esa mapil <u>je</u> ha moj.'''....''There was a storm <u>during</u> the night.''
::* '''<u>Ju</u> zamaj.'''....''<u>Until</u> tomorrow morning.''
::* '''At voy teataye et <u>ji</u> zoyejub.'''....''I have not seen you <u>since</u> last week.''
::* '''Diwe xu hes <u>av</u> at.'''....''Please do something <u>for</u> me.''
::* '''Hia dyes se <u>ayv</u> dalzeyntun.'''....''This book is <u>about</u> linguistics.''
::* '''Hia dyen se din <u>vyel</u> ewa fiuti.'''....''This book is a story <u>about</u> two lovers.''
::* '''Datan se ga fia <u>vyel</u> nas.'''....''Friendship is better <u>than</u> money.''
::* '''Hos se ge fua <u>vyel</u> has hu yat xola zojab.'''....''Nothing is as bad <u>as</u> what we underwent last year.''
::* '''Yit yexeya <u>ov</u> yat.'''....''They were working <u>against</u> us.''
::* '''Ha vakdibut dopoxa at <u>oyv</u> ata azovdeyni.'''....''The police officer arrested me <u>despite</u> my protests.''
::* '''At se <u>ev</u> hua doyafkexut.'''....''I am <u>neither for nor against/neutral toward</u> that candidate.''
::* '''Et <u>ay</u> Bob yeyfe ser dati.'''....''You <u>and</u> Bob should be friends.''
::* '''Duhot ako, et <u>ey</u> at?'''....''Who will win, you <u>or</u> I?''
::* '''Hyat <u>oy</u> hwut ta ha dud.'''....''Everyone <u>but</u> that guy knew the answer.''
::* '''Esa mag <u>yub</u> at.'''....''There was a fire <u>near</u> me.''::
::* '''Voy ese fabi <u>yuz</u> ata tam.'''....''There are no trees <u>around</u> my house.''
::* '''Et yafo tyoper <u>yez</u> ha kunad.'''....''You'll have to walk <u>along</u> the edge.''
::* '''Ese gla mari <u>yiz</u> yata amar.'''....''There are many stars <u>beyond</u> our sun.''
::* '''Ha fepet tyopa iz <u>zye</u> hia mes.'''....''The cat walked right <u>through</u> this door.''
::* '''<u>Boy</u> yombiel, tej voy se fia.'''....''<u>Without</u> ice cream, life is not good.''
::* '''Et voy se <u>gel</u> at.'''....''You are not <u>like</u> me.''
::* '''Et se hyagla <u>ogel</u> at.'''....''You are totally <u>unlike</u> me.''
::* '''Ewa <u>gab</u> ewa gese uwa.'''....''Two <u>plus</u> two equals four.''
::* '''Uwa <u>gob</u> ewa gese ewa.'''....''Four <u>minus</u> two equals two.''
::* '''Ewa <u>gal</u> ewa gese uwa.'''....''Two <u>times</u> two equals four.''
::* '''Ewa <u>gol</u> ewa gese awa.'''....''Two <u>divided by</u> two equals one.''
::* '''Uwa <u>gar</u> ewa gese asya.'''....''Four squared (4<sup>2</sup>) equals sixteen. (Lit: Four <u>to the power of</u> two...)''
::* '''Alya <u>gor</u> e gese u.'''....''The square root (√16) of sixteen is four. (Lit: Sixteen <u>to the minus power of</u> two...)''
=== Hybridized Prepositions ===
:: Some of the above prepositions can be hybridized:
::* '''<u>bui</u> taam'''....''<u>to and fro</u> home''
::* '''<u>zui</u> ha dodalut'''....''<u>to the left and right of</u> the speaker''
::* '''<u>gaob</u> glos'''....''<u>plus or minus</u> a bit''
::* '''<u>aov</u> at'''....''<u>for or against</u> me''
::* '''<u>aoyeb</u> ha tim'''....''<u>in and out of</u> the room''
::* '''<u>aob</u> ha seem'''....''<u>on and off</u> the counter''
== Compound Prepositions ==
: '''''Compound prepositions''''' require the use of multiple morphemes, including prepositions, adverbs, and nouns.
=== Compound Prepositions Using Adverbs ===
: There are certain directional adverbs that can play a part in forming prepositional phrases, but cannot act as prepositions in and of themselves:
::{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Adverbs Used in Compound Prepositions
|-
| '''iz'''....''directly, straight'' || '''uz'''....''indirectly, roundabout''
|-
| '''yab'''....''up'' || '''yob'''....''down''
|-
| '''yan'''....''together'' || '''yon'''....''apart''
|-
| '''zay'''....''forward, ahead'' || '''zoy'''....''back''
|-
| '''zi'''....''right'' || '''zu'''....''left''
|}
: The next chart lists some compound prepositions using the above adverbs or other combinations. Note that when combining two words, if the first word ends in '''b''' and the second begins with '''b''', one of the '''b''' 's is dropped.
::{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Compound Prepositions Using Adverbs and Other Prepositions
|-
! Compound Preposition !! Example
|-
| '''ab bu'''....''onto'' || '''Ha zyun pyosa <u>ab bu</u> ha abtamas.'''....''The ball fell <u>onto</u> the roof.''
|-
| '''ob bi'''....''off of'' || '''Ha zyun pyosa <u>ob bi</u> ha abtamas.'''....''The ball fell <u>off of</u> the roof.''
|-
| '''yab bu'''....''up to''|| '''It fu paper <u>yab bu</u> ha mam.'''....''He would like to fly <u>up to</u> the sky.''
|-
| '''yab bi'''....''up from'' || '''Su <u>yab bi</u> ha sum.'''....''Get <u>up from</u> the bed.''
|-
| '''yab yez'''....''up (along)'' || '''Yat tyoyapo <u>yab yez</u> ha memyayz.'''....''We will walk <u>up</u> the hill.''
|-
| '''yab be'''....''up at'' || '''Ha kapet kaxwa <u>yab bee</u> ha tam.'''....''The dog was found <u>up at</u> the house.''
|-
| '''yab ab'''....''up on, upon'' || '''Ha fepet se <u>yab ab</u> ha abtamas.'''....''The cat is <u>up o</u>n the roof.''
|-
| '''yob bu'''....''down to'' || '''Igpu <u>yob bu</u> ha obmos.'''....''Run <u>down to</u> the cellar.''
|-
| '''yob bi'''....''down from'' || '''Ha tat upa <u>yob bi</u> ha mam.'''....''The angel came <u>down from</u> the sky.''
|-
| '''yob yez'''....''down'' || '''Iyt igtyoyapa <u>yob yez</u> ha meab.'''....''She ran <u>down</u> the hill.''
|-
| '''yob be'''....''down at'' || '''Ha dyes kaxwa <u>yob be</u> ha obem.'''....''The book was found <u>down at</u> the bottom.''
|-
| '''yob ab'''....''down on'' || '''Has kaxwa <u>yob ab</u> eta oybmos.'''....''It was found <u>down on</u> your floor.''
|-
| '''yeb bu'''....''into'' || '''It pusa <u>yeb bu</u> ha mip.'''....''He jumped <u>into</u> the river.''
|-
| '''yeb bi'''....''in from'' || '''Upu <u>yeb bi</u> ha oma oyebem.'''....''Come <u>in from</u> the cold outdoors.''
|-
| '''oyeb be'''....''out in/at'' || '''Ha tudi sa <u>oyeb be</u> ha zodeym.'''....''The children were <u>out in</u> the backyard.''
|-
| '''oyeb bi'''....''out from'' || '''Yepu <u>oyeb bi</u> ha om.'''....''Come in <u>out from</u> the cold.''
|-
| '''oyeb buu'''....''out to'' || '''Yat fu peper <u>oyeb bu</u> ha meim.'''....''We'd like to ride <u>out to</u> the countryside.''
|-
| '''iz bu'''....''straight to'' || '''Pu <u>iz bu</u> fyomir!''' ....''Go <u>straight to</u> hell!''
|-
| '''iz zoy bi'''....''right back from'' || '''It upu <u>iz zoy bi</u> ha yexim.'''....''He came <u>right back from</u> the office.''
|-
| '''zay bu'''....''on to, forth to, ahead to'' || '''Ha bixpur popa <u>zay bu</u> zona doym.'''....''The train traveled <u>on to</u> the next town.''
|-
| '''zey bi'''....''across from'' || '''At simbeseya <u>zey bi</u> et.'''....''I was sitting <u>across from</u> you.''
|-
| '''zoy bi'''....''back from'' || '''At se <u>zoy bi</u> ha yextim.'''....''I am <u>back from</u> the office.''
|-
| '''zoy bu'''....''back to'' || '''Pu <u>zoy bu</u> ha nam.'''....''Go <u>back to</u> the store.''
|-
| '''zoy be'''....''back at'' || '''Duven et se <u>zoy be</u> tam?'''....''Are you <u>back at</u> home?''
|-
| '''zu bi'''....''to the left of'' || '''Ata tam se <u>zu bi</u> hut.'''....''My house is <u>to the right of</u> that guy's.''
|-
| '''zi bi'''....''to the right of'' || '''Huta tam se <u>zi bi</u> atas.'''....''That guy's house is <u>to the right of</u> mine.''
|-
| '''yan bay'''....''together with'' || '''Wit pa <u>yan</u> bay at bu ha dyezam.'''....''He went <u>together with</u> me to the theater.''
|-
| '''yon bi'''....''apart from'' || '''<u>Yon bi</u> at, hyot ta ha dud.'''....''<u>Apart from</u> me, nobody knew the answer.''
|}
=== Prepositional Phrases Using Spatial Nouns ===
: The following chart shows how prepositions and directional adverbs can be joined with the spatial ending '''-(e)m''' meaning ''place'' (or others) to be form spatial nouns, which, in turn, can be used in idiomatic prepositional phrases:
:{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Spatial Nouns Built on Prepositions or Adverbs
|-
| '''ab'''....''on'' || '''abem'''....''top''<br>'''abned'''....''upper surface''<br>'''abmas'''....''roof''
|-
| '''eb'''....''between'' || '''ebem'''....''interstice''<br>'''ebjob'''....''interval''<br>'''ebnod'''....''intersection''<br>'''ebmas'''....''partition''
|-
| '''ob'''....''off'' || '''obem'''....''bottom''<br>'''obned'''....''lower surface''<br>'''obmas'''....''foundation''
|-
| '''ayb'''....''above'' || '''aybem'''....''area above''<br>'''aybmas'''....''ceiling''
|-
| '''oyb'''....''below'' || '''oybem'''....''area below''<br>'''oybmas'''....''floor''
|-
| '''eyb'''....''among'' || '''eybem'''....''midst''
|-
| '''yab'''....''up'' || '''yabem'''....''upstairs, upper area''<br>'''yabneg'''....''top level''
|-
| '''yob'''....''down'' || '''yobem'''....''downstairs, lower area''<br>'''yobneg'''....''bottom level''
|-
| '''yeb'''....''in'' || '''yebem'''....''inside, interior, indoors''<br>'''yebnig'''....''inner space''
|-
| '''oyeb'''....''out'' || '''oyebem'''....''outside, exterior, outdoors''
|-
| '''za'''....''in front of'' || '''zam'''....''front, foreground''<br>'''zan'''....''face''
|-
| '''ze'''....''in the middle of'' || '''zem'''....''middle''<br>'''zenod'''....''center, hub''<br>'''zen'''....''center''<br>'''zenad'''....''median''
|-
| '''zo'''....''behind'' || '''zom'''....''back, rear, background''
|-
| '''zi'''....''right'' || '''zim'''....''right area''<br>'''zikum'''....''left side''<br>'''ziizon'''....''right direction''<br>'''imer'''....''east''
|-
| '''zu'''....''left'' || '''zum'''....''left area''<br>'''zukum'''....''left side''<br>'''zuizon'''....''left direction''<br>'''umer'''....''west''
|-
| '''iz'''....''straight'' || '''izmep'''....''direct route''<br>'''iznad'''....''vector''<br>'''izon'''....''direction''
|-
| '''uz'''....''indirectly'' || '''uzmep'''....''detour''<br>'''uznad'''....''curve''<br>'''uzon'''....''deviation''
|-
| '''yub'''....''near'' || '''yubem'''....''vicinity''<br>'''yubkum'''....''near side''<br>'''yubaj'''....''recent past''
|-
| '''yib'''....''far'' || '''yibem'''....''distance''<br>'''yibkum'''....''far side''<br>'''yibnod'''....''pole''<br>'''yiboj'''....''distant future''
|-
| '''yuz'''....''around'' || '''yuzem'''....''perifery''<br>'''yuznad'''....''perimeter''<br>'''yuznig'''....''environment''
|-
| '''yiz'''....''beyond'' || '''yizem'''....''area beyond''<br>'''yiznod'''....''extremity''
|}
: The following chart shows phrasal prepositions that can be created with the use of the spatial nouns in the previous section or other nouns. These phrases are considered idiomatic, because they are abbreviated by the omission of the definite article '''ha''' in front of the noun:
:{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Idiomatic Phrasal Prepositions
! At Somewhere !! To Somewhere !! From Somewhere
|-
| '''be abem bi'''....''at the top of'' || '''bu abem bi'''....''to the top of'' || '''bi abem bi'''....''from the top of''
|-
| '''be obem bi'''....''at the bottom of'' || '''bu obem bi'''....''to the bottom of'' || '''bi obem bi'''....''from the top of''
|-
| '''be ebem bi'''....''in the area between'' || '''bu ebem bi'''....''to the area between'' || '''bi ebem bi'''....''from the area between''
|-
| '''be aybem bi'''....''above, over'' || '''bu aybem bi'''....''to the area above'' || '''bi aybem bi'''....''from the area above''
|-
| '''be oybem bi'''....''below, under'' || '''bu oybem bi'''....''to the area below'' || '''bi oybem bi'''....''from the area below''
|-
| '''be eybem bi'''....''amid'' || '''zye eybem bi'''....''through the midst of'' || '''bi eybem bi'''....''from the midst of''
|-
| '''be zam bi'''....''at the front of'' || '''bu zam bi'''....''to the front of'' || '''bi zam bi'''....''from the front of''
|-
| '''be zem bi'''....''at the middle of'' || '''bu zem bi'''....''to the middle of'' || '''bi zem bi'''....''from the middle of''
|-
| '''be zom bi'''....''at the back of'' || '''bu zom bi'''....''to the back of'' || '''bi zom bi'''....''from the back of''
|-
| '''be zim bi'''....''at the right of'' || '''bu zim bi'''....''to the right of'' || '''bi zim bi'''....''from the right of''
|-
| '''be zum bi'''....''at the left of'' || '''bu zum bi'''....''to the left of'' || '''bi zum bi'''....''from the left of''
|-
| '''be yubem bi'''....''in the vicinity of'' || '''bu yubem bi'''....''to the vicinity of'' || '''bi yubem bi'''....''from the vicinity of''
|-
| '''be yibem bi'''....''at a distance from'' || '''bey azon bi'''....''by dint of'' || '''be avon bi'''....''in favor of''
|-
| '''be ubem bi'''....''in the direction of'' || '''bay ux bi'''....''with assistance from'' || '''be byux bay'''....''in touch with''
|-
| '''be yabem bi'''....''in the upper reaches of'' || '''be vyen bu'''....''in relation to'' || '''doytaxwa bay'''....''associated with''
|-
| '''be yobem bi'''....''in the bottom area of'' || '''be ned bi'''....''on the level of'' || '''be mep bu'''....''on the way to, en route''
|-
| '''be yebem bi'''....''on the inside of, inside'' || '''be oyebem bi'''....''on the outside of, outside'' || '''bu oyebem bi'''....''to the exterior of''
|-
| '''bey mep bi'''....''by way of, via'' || '''be kum bi'''....''beside, at the side of'' || '''be ij bi'''....''at the start of''
|-
| '''be uj bi'''....''at the end of'' || '''bey uxun bi'''....''by means of'' || '''be kunad bi'''....''at the edge of''
|-
| '''be nod bi'''....''at the point of'' || '''be yebem bi'''....''at the interior of, inside'' || '''be oyebem bi'''....''at the exterior of, outside''
|-
| '''be nad bay'''....''in line with'' || '''be uznod bi'''....''alongside'' || '''be tes bi'''....''in the sense of''
|-
| '''be teas bi'''....''in the guise of'' || '''be san bi'''....''in the form of'' || '''be yanx bi'''....''in conjunction with''
|-
| '''be bol bi'''....''in support of'' || '''be gab bu'''....''in addition to'' || '''be dyun bi'''....''in the name of''
|-
| '''be avson bi'''....''on behalf of'' || '''be vyeson bi'''....''on the subject of'' || '''bay yux bi'''....''with the aid of''
|}
== Adjectivized Prepositions ==
: Simple prepositions can be converted into adjectives by suffixing the adjectival ending '''-a'''. Here are some examples:
::* '''aba'''....''superior'' (ex. '''aba doyevam'''....''superior court'')
::* '''oba'''....''inferior''
::* '''ayba'''....''upper''
::* '''oyba'''....''lower''
::* '''yaba'''....''high''
::* '''yoba'''....''low''
::* '''eba'''....''in-between''
::* '''gaba'''....''additional''
::* '''goba'''....''subtractive''
::* '''gala'''....''multiple''
::* '''gaza'''....''logarithmic''
::* '''gea'''....''equal''
::* '''gela'''....''same''
::* '''iba'''....''away''
::* '''ogea'''....''unequal''
::* '''jaa'''....''anterior, prior''
::* '''jea'''....''present''
::* '''joa'''....''posterior''
::* '''ava'''....''in favor, favorable, pro''
::* '''eva'''....''neutral''
::* '''ova'''....''against, unfavorable, counter''
::* '''oyva'''....''opposite, inverse''
::* '''yeba'''....''inner''
::* '''oyeba'''....''outer''
::* '''yeza'''....''flush''
::* '''yuba'''....''near''
::* '''yiba'''....''far, distant''
::* '''yiza'''....''extreme, yonder''
::* '''yuza'''....''circular''
::* '''zaa'''....''front, anterior''
::* '''zea'''....''medial, middle''
::* '''zoa'''....''rear, back, posterior''
::* '''zia'''....''left''
::* '''zua'''....''right''
: A slight nuanced meaning can be achieved by suffixing '''-na''' instead of '''-a'''.
::* '''jana'''....''previous''
::* '''jona'''....''next''
::* '''zana'''....''next, anterior''
::* '''zona'''....''last, posterior''
::* '''ovna'''....''antithetical''
::* '''yebna'''....''interior, internal''
::* '''oyebna'''....''exterior, external''
::* '''zena'''....''central''
::* '''ebna'''....''intermediate''
::* '''yizna'''....''ulterior, extreme''
::* '''yuzna'''....''peripheral''
::* '''yubna'''....''proximate''
== Prepositions and Adverbs as Verb Prefixes ==
: Prepositions and adverbs can be prefixed to verbs to alter their directionality. If such a prefix ends in '''-b''' and the verb is a form of '''ber''' (''to put'') or '''per''' (''to go''), the final '''b''' of the prefix is dropped.
: Let take the verbs '''per''' (''to go'') and '''ber''' (''to put'') as examples:
::{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Prepositional/Adverbial Prefixes on Verbs
|-
! Preposition/Adverb !! '''per''' (intr.) !! '''ber''' (tr.)
|-
| '''ab'''....''on'' || '''aper'''....''to get on, to board'' || '''aber'''....''to put on, apply''
|-
| '''ob'''....''off'' || '''oper'''....''to get off, to dismount'' || '''ober'''....''to take off, remove''
|-
| '''eb'''....''between'' || '''eper'''....''to intervene'' || '''eber'''....''to block''
|-
| '''ib'''....''away'' || '''iper'''....''to go away'' || '''iber'''....''to receive''
|-
| '''ub'''....''toward'' || '''uper'''....''to come'' || '''uber'''....''to send''
|-
| '''yab'''....''up'' || '''yaper'''....''to get up, to rise, to ascend'' || '''yaber'''....''to raise''
|-
| '''yob'''....''down'' || '''yoper'''....''to get down, to descend'' || '''yober'''....''to lower''
|-
| '''yeb'''....''in'' || '''yeper'''....''to get in, to enter'' || '''yeber'''....''to put in''
|-
| '''oyeb'''....''out'' || '''oyeper'''....''to get out, to exit'' || '''oyeber'''....''to take out''
|-
| '''yub'''....''near'' || '''yuper'''....''to get near, to approach'' || '''yuber'''....''to bring''
|-
| '''yib'''....''far'' || '''yiper'''....''to retreat, to distance oneself'' || '''yiber'''....''to remove''
|-
| '''yiz'''....''beyond'' || '''yizper'''....''to pass, exceed'' || '''yizber'''....''to pass''
|-
| '''yuz'''....''around'' || '''yuzper'''....''to go around, to circulate'' || '''yuzber'''....''to encircle''
|-
| '''yez'''....''along'' || '''yezper'''....''to go along'' || '''yezber'''....''to set along''
|-
| '''yan'''....''together'' || '''yanper'''....''to get together, to meet'' || '''yanber'''....''to join''
|-
| '''yon'''....''apart'' || '''yonper'''....''to go apart, to separate''|| '''yonber'''....''to separate''
|-
| '''ja'''....''before'' || '''japer'''....''to go before, to precede'' || '''jaber'''....''to prepare''
|-
| '''jo'''....''after'' || '''joper'''....''to go after, to follow''|| '''jober'''....''to postpone''
|-
| '''za'''....''front'' || '''zaper'''....''to lead, to go in front''|| '''zaber'''....''to put in front''
|-
| '''zo'''....''back'' || '''zoper'''....''to lag, to go in back'' || '''zober'''....''to delay''
|-
| '''zay'''....''forward'' || '''zayper'''....''to go forward, to advance'' || '''zayber'''....''to put forward''
|-
| '''zoy'''....''backward'' || '''zoyper'''....''to go back, to return'' || '''zoyber'''....''to put back''
|-
| '''zey'''....''across'' || '''zeyper'''....''to go across, to transit'' || '''zeyber'''....''to transfer''
|}
: If the verb to which a prefixed preposition ending in '''-b''' is attached begins in a '''b''', but a verb other than '''ber''', the '''b''' of the prefix remains. If the stem begins in '''p''', the '''b''' of the prefixed preposition is dropped.
::* '''ab''' + '''byexer'''....''to strike'') => '''abbyexer'''....''to pat''
::* '''ab''' + '''pyexer'''....''to hit'') => '''apyexer'''....''to attack''
: The above rule is applied, because otherwise, ambiguities could arise. For example, '''abyexer''' could be analyzed as '''ab+byexer''' (''to hit on = to pat'') or '''ab+yexer''' (''to work on'').
== Separable Verb Prefixes ==
: Verbal prefixes that are formed from prepositions and adverbs can usually be "unpacked", that is, treated as separate words. This works like separable verbs in German. The following table demonstrates this:
::{| class="wikitable" style="background:lightyellow;{{Text default color}}; font-size:smaller;"
|+ Separable Verb Prefixes
|-
! Verb-bound !! Unpacked !! English
|-
| '''Mapuzlun <u>yuzpa</u> yata tam.''' || '''Mapuzlun <u>pa yuz</u> yata tam.'''||''A tornado circled/went around our house. (= went around)''
|-
| '''Ha yux bi calk yeyfe <u>yobnogxwer</u>.''' || '''Ha yux bi cal yeyfe <u>nogxwer yob</u>.'''||''The use of carbon should be downscaled. (= scaled down)''
|-
| '''Yat <u>zaybuxo</u> hia dovyabdren.''' || '''Yat <u>buxo</u> hia dovyabdren <u>zay</u>.'''||''We shall advance this legislation. (= push forward)''
|}
<noinclude>{{Chapter navigation with TOC|Verbs|Conjunctions}}</noinclude>
6gohmwzi9aggoxvn7ggc4kx5dqm83ey
Mirad Grammar/Conjunctions
0
417651
4669611
4662216
2026-09-10T15:07:55Z
Tyoyafud
6233
/* Correlative Coordinating Conjunctions */
4669611
wikitext
text/x-wiki
<noinclude>{{status|100%}}</noinclude>
= Types of Conjunctions =
: Conjunctions are words that join or introduce clauses. There are two major types of conjunctions, with some minor categories noted below:
::1. '''''Coordinating Conjunctions'''''
::::* Simple Linking Conjunctions, such as ''and, or, but''
::::* Correlative Conjunctions, such as ''either...or, neither...or, both...and''
::::* Adverbial Coordinating Conjunctions, such as ''then, also, therefore''
::2. '''''Subordinating Conjunctions'''''
::::* Complementizing Conjunctions, such as ''that, if, whether, lest''
::::* Relative Conjunctions, such as ''as, when, because, while''
== Coordinating Conjunctions ==
: Mirad has three types of coordinating conjunctions, as shown in the following charts:
=== Simple Linking Conjunctions ===
:{| class="wikitable" style="background:lightyellow;{{text default color}} font-size:smaller;"
|+ Simple Linking Conjunctions
! Conjunction !! Example
|-
| '''ay'''....''and'' || '''At oveko <u>ay</u> at ako.'''<br>''I will compete <u>and</u> I will win.''
|-
| '''ey'''....''or'' || '''Bosu <u>ey</u> at tuyapyexo et.'''<br>''Be still <u>or</u> I will spank you.''
|-
| '''oy'''....''but'' || '''It yeka <u>oy</u> it oka.'''<br>''He tried <u>but</u> he lost.''
|-
| '''oey'''....''nor'' || '''At voy tilo <u>oey</u> at telo.'''<br>''I shall not drink, <u>nor</u> shall I eat.''
|-
| '''bayhus'''....''yet'' || '''At ayse hyas at fe, <u>bayhus</u> at voy se iva.'''<br>''I have everything I want, <u>yet</u> I'm not happy.''
|-
| '''avhus'''....''so'' || '''Ha amar yapaye, <u>avhus</u> et yefe sumpier.'''<br>''The sun has risen, <u>so</u> you must get up out of bed.''
|}
=== Correlative Coordinating Conjunctions ===
: The following conjunctions come in pairs:
:{| class="wikitable" style="background:lightyellow;{{text default color}} font-size:smaller;"
|+ Correlative Coordinating Conjunctions
! Conjunction !! Example
|-
| '''hyaewa...ay'''....''both...and'' || '''At <u>hyaewa</u> dyee <u>ay</u> dre Mirad.'''<br>''I <u>both</u> read <u>and</u> write Mirad.''
|-
| '''hyeawa...ey'''....''either...or'' || '''Et yafe <u>hyeawa</u> beser <u>ey</u> pier. Se eta kebiun.'''<br>''You can <u>either</u> stay <u>or</u> leave. It's your choice.''
|-
| '''hyoawa...oey'''....''neither...nor'' || '''Yat <u>hyoawa</u> move <u>oey</u> tile.'''<br>''We <u>neither</u> smoke <u>nor</u> drink.''
|-
| '''voy hyawa'''...'''oy (gay)'''....''not only...but (also)'' || '''At <u>voy hyawa</u> deuze <u>oy gay</u> at daze.'''<br>''I <u>not only</u> sing <u>but also</u> I dance.''
|-
| '''ven'''....'''avhus'''....''if...then'' || '''<u>Ven</u> et te ha dud, <u>avhus</u> du has.'''<br>''<u>If</u> you know the answer, <u>then</u> say it.''
|-
|'''ha'''...'''ha'''....''the...the'' || '''<u>Ha</u> ga et tixe, <u>ha</u> ga et akujo.'''<br>''<u>The</u> more you study, <u>the</u> more you'll succeed.''
|-
| '''ga yukay'''...''vyel''....''rather...than'' || '''At oku <u>ga yukay</u> <u>vyel</u> vyoeker.'''<br>''I'd <u>rather</u> lose <u>than</u> cheat.''
|-
| '''ji van'''...'''iz huj'''....''no sooner...than'' || '''<u>Ji van</u> ha dezut yepa, <u>iz huj</u> ha hyaydeux ija.'''<br>''<u>No sooner</u> did the actor enter <u>than</u> the applause began.''
|-
| '''huugla'''...'''van'''....''so/such...that''||'''Ha map sa <u>huugla</u> aza <u>van</u> ha fab pyoxwa.'''<br>''The wind was <u>so</u> strong <u>that</u> the tree was felled.''
|-
| '''ven'''...'''ey (voy)'''....''whether...or (not)'' || '''<u>Ven</u> et te is <u>ey voy</u>, at tadioye.'''<br>''<u>Whether</u> you know it <u>or not</u>, I am about to get married.''
|}
=== Adverbial Coordinating Conjunctions ===
: Some grammars call these conjunctive adverbs:
:{| class="wikitable" style="background:lightyellow;{{text default color}} font-size:smaller;"
|+ Adverbial Coordinating Conjunctions
|-
! Conjunction !! Example
|-
| '''jo hus / joy'''<br>''then, next, after that'' || '''Yat deuza, <u>jo hus</u> hyat daza.'''<br>''We sang, <u>then</u> everyone danced.''
|-
| '''je hus / jey'''<br>''meanwhile'' || '''<u>Je hus</u>, at ujba hyas.'''<br>''<u>Meanwhile</u>, I finished everything.''
|-
| '''av hus'''<br>''so, therefore'' || '''It vuda at, <u>av hus</u> at pia.'''<br>''He insulted me, <u>so</u> I left.''
|-
| '''(gey) ov hus'''<br>''nevertheless, even so, despite that, yet, however'' || '''At yexa kyotepay, <u>ov hus</u>, at ujoka.'''<br>''I work diligently, <u>yet</u> I failed.''
|-
| '''gel hus / gelay'''<br>''likewise, also, similarly'' || '''At daze. <u>Gel hus</u>, at deuze.'''<br>''You dance; <u>likewise</u>, I sing.''
|-
| '''hyiyen''' / '''geyen'''<br>''in the same way, likewise'' || '''Yit xa fi; <u>hyiyen</u>, et xo gay fi.'''<br>''They did well; <u>in the same way</u>, you will too.''
|-
| '''ey hyuyen hus'''<br>''otherwise, else'' || '''Du hes, <u>ey hyuyen hus</u>, piu.'''<br>''Say something, <u>otherwise</u>, leave.''
|-
| '''gay'''<br>''also'' || '''Et yeka; <u>gay</u>, et ujaka!'''<br>''You tried; <u>also</u>, you succeeded!''
|-
| '''be nem (bi hus)'''<br>''instead (of that)'' || '''Hyot fida iyt; <u>be nem bi hus</u>, yit fuda iyt.'''<br>''Nobody praised her; <u>instead</u>, they badmouthed her.''
|-
| '''huyen'''<br>''thus, in that way'' || '''Tixu jestay; <u>huyen</u>, et ujako.'''<br>''Study diligently; <u>in that way</u>, you'll succeed.''
|-
| '''av hus'''<br>''for that reason, so, therefore'' || '''At voy ifeyie has; <u>av hus</u>, at pio.'''<br>''I'm not enjoying it, <u>so</u> I will leave.''
|-
| '''vray'''<br>''as a matter of fact, actually, in fact'' || '''<u>Vray</u>, et se vyaka.'''<br>''<u>In fact</u>, you're right.''
|-
| '''gel jos'''<br>''consequently, as a consequence'' || '''Wit baksa; <u>gel jos</u>, wit toja.'''<br>''He got sick; <u>as a consequence</u>, he died.''
|-
| '''gel xin'''<br>''as a result'' || '''At voy tixa; <u>gel xin</u>, at okuja.'''<br>''At didn't study; <u>as a result</u>, I failed.''
|-
| '''ga vyel hus'''<br>''moreover, what's more'' || '''Mamila. <u>Ga vyel hus</u>, esa mamxeus.'''<br>''It rained. <u>Moreover</u>, there was thunder.''
|-
| '''be hyua duni'''<br>''in other words'' || '''At voy da ha vyan; <u>be hyua duni</u>, at vyoda.'''<br>''It did not tell the truth; <u>in other words</u>, I lied.''
|-
| '''jey'''<br>''meanwhile, in the meantime'' || '''Ha toboti xeya gla xeus; <u>jey</u>, at jesa tixer.'''<br>''The children were making a lot of noise; <u>meanwhile</u>, I continued to study.''
|-
| '''ovay'''<br>''on the contrary'' || '''Ha tam voy se aga; <u>ovay</u>, has se gle oga.'''<br>''The house is not big; <u>on the contrary</u>, it's rather small.''
|-
| '''bi hyua teasgun'''<br>''on the other hand'' || '''At voy deuze. <u>Bi hyua teasgun</u>, at eke duzar.'''<br>''I don't sing. <u>On the other hand</u>, I play a musical instrument.''
|-
| '''gey bay hus'''<br>''still, even so'' || '''Voy esa duz, <u>gey bay hus</u>, ha xej sa ifxea.'''<br>''There was no music. <u>Even so</u>, the event was entertaining.''
|-
| '''ujnay'''<br>''finally, in the end'' || '''<u>Unjnay</u>, hyoa fus xwa.'''<br>''<u>In the end</u>, nothing bad happened.''
|}
== Subordinating Conjunctions ==
: Subordinating Conjunctions introduce three types of dependent or subordinate clauses:
::1. '''''Adjectival''''' subordinate clauses (also called relative clauses)
::::* He is the guy <u>that earned the most this year</u>. The subordinate clause modifies a noun in the main clause. Adjectival clauses are introduced in Mirad by the relative complementizer '''ho'''. Relative clauses are discussed in [[Mirad Grammar/Verbs#Relative Clauses|the Relative Clauses section of the chapter on Verbs]].
::2. '''''Nominal''''' subordinate clauses (also called factive clauses)
::::* I knew <u>that she would come</u>. The subordinate clause is the object or complement of a verb in the main clause. Nominal subordinate clauses are introduced by one of the factive complementizers '''van''', '''ven''', or '''von''', depending on whether the subordinate clause is positive, conditional, or negative.
::3. '''''Adverbial''''' subordinate clauses (also called circumstantial clauses).
::::* Did you see <u>where they went</u>?. The subordinate clause is an adverbial clause modifying a verb in the main clause for time, place, manner, and other circumstances. Adverbial subordinate clauses are introduced by relative deictic adverbs like '''hom'''....''where'', '''hoj'''....''when'', and '''hosav'''....''why''.
===Complementizers===
:: The complementizers above are part of an overall scheme. In the chart below, the six complementizers act:
:::* as a '''''clause linker''''', where the complementizer introduces a clause that is a statement of FACT or CONDITION, or
:::* as a '''''sentence introducer''''', where the complementizer introduces a sentence that is a command/wish, a prohibition, or a yes-no question. Some of these complementizers can act in either or both roles. In actuality, all of the complementizers introduce or link a subordinate clause; it's just that in some cases, the main clause is left unexpressed.
:{| class="wikitable" style="background:lightyellow;{{text default color}} font-size:smaller;"
|+ Complementizers
|-
! Type !! Complementizer !! Clause Linker !! Sentence Introducer
|-
!row=1| Positive / Hortative
| '''van''' || ''that, the fact that'' || ''May....(something happen), Let....(something happen)''
|-
!row=1| Conditional
| '''ven''' || ''if, whether'' || --
|-
!row=1| Negative / Prohibitive
| '''von''' || ''lest, that...not'' || ''Don't''
|-
!row=1| Anti-Conditional
| '''oven''' || ''unless'' || --
|-
!row=1| Interrogative
| '''Duven...?''' || -- || ''Is it true that, say whether..., do(es)?''
|-
!row=1| Relative
| '''ho''' || ''that, which, who(m)'' || --
|}
: Examples of these conjunctions linking a main and subordinate clause:
::* '''At ta <u>van</u> et upo.'''....''I knew <u>that</u> you would come.'' (FACTIVE)
::* '''At xa is <u>av van</u> et testu.'''....''I did it <u>so that</u> you would understand.''
::* '''At voy ta <u>ven</u> et upo.'''....''I did not know <u>whether</u> you would come.'' (CONDITIONAL)
::* '''<u>Ven</u> et te ha dud, du has.'''....''<u>If</u> you know the answer, say it.'' (CONDITIONAL)
::* '''At yufa <u>von</u> et upu.'''....''I feared <u>lest</u> you might come.'' (PROHIBITIVE)
::* '''At voy upo <u>oven</u> et upo gay.'''....''I will not come <u>unless</u> you come, too.'' (ANTI-CONDITIONAL)
::* '''At fe teater ha tob <u>ho</u> xa his.'''....''I want to see the man <u>who</u> did this.'' (RELATIVE)
::* '''At fe teater <u>hoa</u> tob xa his.'''....''I want to see <u>which</u> man did this.''
::* '''Iyt akeye <u>oyv van</u> iyt bayse yofi.'''....''She is winning <u>despite the fact that</u> she has disabilities.''
: Example of these conjunctions introducing different types of sentences:
::* '''<u>Van</u> yat fyadilu.'''....''<u>Let</u> us pray.'' (Hortative, i.e., A WISH)
::* '''<u>Van</u> yit teliu avol!'''....''<u>Let</u> them eat bread.''
::* '''<u>Van</u> ha edweb yagteju.'''....''<u>May</u> the king live long.''
::* '''<u>Duven</u> et te ha dud?'''....''<u>Do</u> you know the answer?'' (YES/NO QUESTION)
::* '''<u>Duven</u> et se tadxwa.'''....''<u>Are</u> you are married.'' (SAY WHETHER...)
::* '''<u>Von</u> (et) yufu.'''....''<u>Don't</u> (you) be afraid.'' (Prohibitive, i.e., AN INJUNCTION)
::* '''<u>Von</u> hus xwu.'''....''Let that <u>not</u> happen.'' (NEGATIVE HORTATIVE)
: The sentence-initial interrogative complementizer '''Duven''' (''Is it true that?'') is used to introduce a yes/no question. The word can be analyzed as a command meaning ''Say whether...'' where '''Say...''' is the main clause in the imperative mood.
::* '''<u>Duven</u> et se tadokyayt?'''....''Are you a widow? (= <u>Say whether</u> you are...).''
: '''Av van''' <big>+</big> a predicate in the hypothetical mood expresses a "so that, in order that" clause, eg.:
::* '''At uzba ata teb <u>av van</u> at yafu teater hos xowe<sup>*</sup>.'''....''I turned my head <u>so that</u> I could see what was about to happen.''
: Using the negative complementizer, '''von''', the above sentence could be rephrased as:
::* '''At uzba ata teb <u>av von</u> at teatu hos xowe.'''....''I turned my head <u>so that</u> I wouldn't see what was about to happen.''
: Since the subject is the same in both clauses, the sentence could be expressed more easily with an infinitive:
::* '''At uzba ata teb <u>av (~ ov) teater</u> hos xowe.'''....''I turned my head <u>so as (not) to see</u> what was about to happen.''
: * <small>'''xowe''' means ''is about to happen/be done''. Unlike English, there is no relative sequencing of tenses in conjoined clauses. "''I knew she <u>would</u> come.''" is rendered in Mirad with direct sequences of tenses, i.e. as "''I knew that she <u>will</u> come.''" Also, unlike English, the "that" conjunction cannot be left out: '''At ta <u>van</u> iyt upo.'''</small>
=== Conjunctions with the subordinate conjunctions van/ven/von ===
:: Conjunctions introducing nominal subordinate clauses consist of a preposition followed by the positive complementizer '''van''', the conditional complementizer '''ven''', or the negative complementizer '''von'''. English can use a bare preposition as a conjunction, as in the sentence "He will grow up <u>before</u> you notice it." However, Mirad requires the complementizer, much as in French, where "avant" (before) must be accompanied by "que" when followed by a clause ("Il se grandira <u>avant que</u> tu ne le remarques.") Here is a chart showing the most important of these conjunctions:
::{| class="wikitable" style="background:lightyellow;{{text default color}} font-size:smaller;"
|+ Subordinating conjunctions with '''van''' and '''ven'''
|-
! Conjunction !! Example
|-
| '''ja van'''<br>''before'' || '''Du hay <u>ja van</u> et pio.'''<br>''Say hi <u>before</u> you leave.''
|-
| '''je van'''<br>''while, as long as'' || '''<u>Je van</u> at so him, at xo gle yex av et.'''<br>''<u>While</u> I'm here, I'll do some work for you.''
|-
| '''jo van'''<br>''after'' || '''At buo et has <u>jo van</u> et nuso.'''<br>''I will give it to you <u>after</u> you pay.''
|-
| '''ojo van'''<br>''by the time''||'''<u>Ojo</u> et puo him, at piayo.'''<br>''By the time you get here, I will have departed.''
|-
| '''ju van'''<br>''until'' || '''Yat voy ijo <u>ju van</u> et puo him.'''<br>''We won't start <u>until</u> you get here.''
|-
| '''ji van'''<br>''since'' || '''At voy teataya huyenas <u>ji van</u> et sa hum.'''<br>''I had not seen such a thing <u>since</u> you were there.''
|-
| '''gey ven'''<br>''even if'' || '''<u>Gey ven</u> et yontexe, at bolo et.'''<br>''<u>Even if</u> you disagree, I'll support you.''
|-
| '''gel ven'''<br>''as if'' || '''Yat yeyfe axler <u>gel ven</u> yat teata hyos.'''<br>''We should act <u>as if</u> we saw nothing.''
|-
| '''gey ov van'''<br>''even though, though'' || '''<u>Gey ov van</u> ha pansin sa gra yaga, at ifia has.'''<br>''<u>Even though</u> the movie was too long, I enjoyed it.''
|-
| '''ov van'''<br>''(al)though, despite the fact that'' || '''At po <u>ov van</u> at voy fe.'''<br>''I'll go, <u>although</u> I don't want to.''
|-
| '''av van'''<br>''so (that)'' || '''It utifbua <u>av van</u> hyuti teju.'''<br>''He sacrificed himself <u>so that</u> others might live.''
|-
| '''av von'''<br>''lest, so that...not'' || '''It utifbua <u>av von</u> hyuti toju.'''<br>''He sacrificed himself <u>so that</u> others might not die (= ''lest others might die'').''
|-
| '''Buwa van'''<br>''in as much as, given that'' || '''<u>Buwa van</u> iyt se tadiwa, at voy byuxo iyt.'''<br>''<u>Given that</u> she's married, I won't touch her.''
|-
|'''Hij van'''<br>''now that'' ||'''<u>Hij van</u> et se him, biu hegla kafeyl.'''<br>''<u>Now that</u> you're here, have some coffee.''
|-
| '''Vakuwa van'''<br>''provide that''||'''<u>Vakuwa</u> van et se yukoma, at hoydo.'''<br>''<u>Provided</u> you're comfortable, I will say my goodbyes.''
|-
| '''ven'''<br>''if''||'''<u>Ven</u> yat fe iber ixuni, yat yefe yexer ga jestay.'''<br>''<u>If</u> we want to get results, we must work harder.''
|-
| '''ven'''<br>''whether''||'''<u>Ven</u> et ijbo ha yexes obyose et.'''<br>''<u>Whether</u> you finish the job is up to you.''
|-
| '''Oven'''<br>''unless''||'''<u>Oven</u> et do hyuyen, at dolo.'''<br>''<u>Unless</u> you say otherwise, I will be silent.''
|}
=== Conjunctions as Circumstantial Clause Headers ===
:: If the conjunction contains a deictic adverb like ''where'', ''when'', ''how'', etc., then the relative form of the deictic adverb is used. The most common of these begin with '''ho-''' or '''hye-''' and behave as in English.
::{| class="wikitable" style="background:lightyellow;{{Text default color}};font-size:smaller;"
|+ Subordinating Conjunctions
|-
! Conjunction !! Circumstance !! Examples
|-
| '''hoj'''<br>''when'' || TIME ||'''<u>Hoj</u> et pua, ha if ija.'''<br>''<u>When</u> you arrived, the fun began.''
|-
| '''hyej'''<br>''whenever''|| TIME ||'''<u>Hyej</u> et dale, at hihide.'''<br>''<u>Whenever</u> you talk, I laugh.''
|-
| '''hom'''<br>''where''|| PLACE || '''At voy te <u>hom</u> it pa.'''<br>''I don't know <u>where</u> he went.''
|-
| '''hyem'''<br>''wherevere''|| PLACE || '''Et yafe per <u>hyem</u> et fu.'''<br>''You can go <u>wherever</u> you'd like.''
|-
| '''hyam'''<br>''everywhere''|| PLACE || '''<u>Hyam</u> at pe, et se hum.'''<br>''<u>Everywhere</u> I go, you're there.''
|-
| '''hosav'''<br>''why'' || CAUSE || '''Duven et te <u>hosav</u> it xa his?'''<br>''Do you know <u>why</u> he did it?''
|-
| '''hosav'''<br>''because''|| CAUSE || '''It xa has <u>hosav</u> it fa teatuer yat hes.'''<br>''He did it <u>because</u> he wanted to show us something.''
|-
| '''hoyen'''<br>''how, as''|| MANNER || '''Xu <u>hoyen</u> et fu van hyuti axlu ub et.'''<br>''Do <u>as</u> you'd want others to act toward you.''
|-
| '''hogla'''<br>''as'' || DEGREE || '''Yexu <u>hogla</u> ugay et efe.'''<br>''Work <u>as</u> slowly as you need to.''
|-
| '''hyegla'''<br>''however much (that)''|| DEGREE || '''Dalu <u>hyegla</u> et efo.'''<br>''Talk <u>however much</u> you need to.''
|-
| '''hoglas'''<br>''as much (as)'' || QUANTITY || '''At telio <u>hoglas</u> at fe.'''<br>''I will eat <u>as much as</u> I want.''
|}
: Other conjunctions of circumstance are sometimes used. This is not a complete list.
<noinclude>{{Chapter navigation with TOC|Prepositions|Interjections}}</noinclude>
sq2j9atnepdpu0a9z48a8v14c0e1de5
History of video games/Platforms/LJN Video Art
0
420831
4669600
4031968
2026-09-10T13:02:24Z
WereSpielChequers
248949
typo
4669600
wikitext
text/x-wiki
==History==
===Development===
On October 30th, 1986 LJN filed a patent with the US Patent office concerning technology used in the device.<ref name="Video Art Patent"/>
===Launch===
The LJN Video Art was launched in 1987.<ref name="LJN Review Gamester81">{{cite web |title=The LJN Video Art System Review - Gamester81 |url=https://www.youtube.com/watch?v=D4NsRAZy1MM |accessdate=31 October 2020}}</ref><!--0:46--> The system cost around $100.<ref name="NYmag">{{cite book |last1=LLC |first1=New York Media |title=New York Magazine |publisher=New York Media, LLC |url=https://books.google.com/books?id=c-QCAAAAMBAJ&pg=PA22&dq=LJN+Video+Art&hl=en&sa=X&ved=2ahUKEwiw4MTX7rHtAhUwmuAKHTefANo4ChDoATAAegQIABAC#v=onepage&q=LJN%20Video%20Art&f=false |access-date=3 December 2020 |language=en}}</ref> A rap jingle was used to promote the device.<ref name="Commercial">{{cite web |title=1987 LJN Video Art commercial |url=https://www.youtube.com/watch?v=neURIc_A3js |access-date=3 December 2020}}</ref>
===Legacy===
The LJN Video Art was discontinued in either 1988<ref name="Video Game Kraken LJN Video Art"/> or 1989.<ref name="LJN Video Art Wikipedia"/> The discontinuation was spurred in part due to difficulties faced by LJN during that time.<ref name="Video Game Kraken LJN Video Art">{{cite web |title=Video Art by LJN Toys Ltd – The Video Game Kraken |url=http://videogamekraken.com/video-art-by-ljn-toys-ltd |accessdate=7 November 2020}}</ref>
Unlike most platforms, the LJN Video Art is perhaps better known for events following discontinuation. In 1990 patents concerning the Video Art were transferred from LJN to an individual.<ref name="Video Art Patent">{{cite web |title=Video art electronic system |url=https://patents.google.com/patent/US4782335A/en?oq=4%2c782%2c335 |access-date=18 May 2021 |language=en |date=1986-10-30}}</ref> From 1993 to 1995 a court battle ensued over LJN Video Art patents and the popular SNES software Mario Paint, though this usage was ultimately ruled as non-infringing.<ref>{{cite web |title=Edward L. Gussin, Plaintiff-appellant, v. Nintendo of America, Inc., Defendant-appellee, 62 F.3d 1433 (Fed. Cir. 1995) |url=https://law.justia.com/cases/federal/appellate-courts/F3/62/1433/535009/ |website=Justia Law |access-date=18 May 2021 |language=en}}</ref><ref>{{cite web |title=The Story of Mario Paint {{!}} Gaming Historian |url=https://www.youtube.com/watch?v=54bXwb5DfRI |access-date=18 May 2021 |language=en}}</ref><!--26:24-->
Much later, the system gained notoriety online for it's poor design.<ref>{{cite news |title=好きなゲームをクソゲーと言われ悔しくて作家デビューした人物の“ゲームSF小説”を読み解く、そこにはゲームレビューの可能性が秘められていた |url=https://jp.ign.com/videogamewithnoname/15365/feature/sf |access-date=26 March 2021 |work=IGN Japan |date=9 July 2017 |language=ja}}</ref>
==Technology==
There does not appear to be any reliable information on technology used by the LJN Video Art.
The system supported drawing with 16 colors.<ref name="Commercial"/><ref>{{cite book |last1=Schellenberg |first1=Kathryn |title=Computers in Society |publisher=Dushkin |isbn=978-0-87967-727-5 |url=https://www.google.com/books/edition/Computers_in_Society/f8MlRheep0UC?hl=en&gbpv=1&bsq=LJN+Video+Art&dq=LJN+Video+Art&printsec=frontcover |access-date=3 December 2020 |language=en}}</ref>
''New York Magazine'' suggested saving art drawn on the LJN Video Art by recording to videotape.<ref name="NYmag"/>
==Notable games==
About 8 cartridges were released for the LJN Video Art, with Marvel, Disney, and Loony Toons licensed releases.<ref name="LJN Review Gamester81"/><!--3:05-->
* ''A Trip To The Zoo''<ref name="LJN Video Art Wikipedia"/>
* ''Disney Coloring Book''<ref name="LJN Video Art Wikipedia"/>
* ''Disney Story Book''<ref name="LJN Video Art Wikipedia"/>
* ''Looney Tunes''<ref name="LJN Video Art Wikipedia"/>
* ''Marvel Super-Heroes''<ref name="LJN Video Art Wikipedia"/>
* ''My Dream Day''<ref name="LJN Video Art Wikipedia"/>
* ''My Favorite Doll''<ref name="LJN Video Art Wikipedia"/>
* ''On the Move''<ref name="LJN Video Art Wikipedia"/>
* ''Video Art Activity Cartridge''<ref name="LJN Video Art Wikipedia">{{cite web |title=LJN Video Art |url=https://en.wikipedia.org/wiki/LJN_Video_Art |website=Wikipedia |access-date=18 May 2021 |language=en |date=2021-04-07}}</ref>
==References==
{{wikipedia|LJN Video Art}}
{{WikipediaCredit}}<!--Games List-->
{{reflist|2}}{{status|100%}}{{BookCat}}__NOTOC__
gevayfe8v07bu3w2tqiaq0ubib6ndyl
Women's Writing Before Woolf: A Social Reference/Anne Cooke Bacon (1527–1610)
0
424708
4669596
4226843
2026-09-10T12:58:00Z
WereSpielChequers
248949
typo
4669596
wikitext
text/x-wiki
= Anne Cooke Bacon (1527-1610) =
== Biography ==
Anne Cooke Bacon, or Lady Bacon, was an English Lady of the British Court, scholar and translator. Her exact birthdate is unknown, but estimated to be 1527-8. Many of the details about her life are unknown. Bacon contributed to English religious literature with her English translation of John Jewel's Latin ''Apologie of the Anglican Church'' in 1564.<ref>York, Laura. “Bacon, Anne Cooke 1528 – 1610”. ''Women in World History: A Biographical Encyclopedia.'' [https://www.encyclopedia.com/women/encyclopedias-almanacs-transcripts-and-maps/bacon-anne-cooke-1528-1610 encyclopedia.com]. 2021.</ref>
Bacon was born in Essex, England, as one of nine siblings. Her father, Anthony Cooke, was a tutor to Henry VIII's son Edward Tudor. He was renowned for his progressive attitudes towards women's education, and as a result, ensured that all his children were well-educated in the humanist tradition. Bacon studied languages such as Latin, French, Italian, and Greek as well as literature. All of her sisters had success from Anthony’s teachings, such as Lady Elizabeth Hoby who is also known for translating texts, as well as her poetic and musical talents. The Cooke sisters—Anne, Elizabeth, Mildred, and Katherine—are arguably more famous than the brothers, despite the patriarchal culture of the time that would see them buried<ref>Ridgway, Claire. "Lady Anne Bacon (née Cooke) 1527/8-1610." [https://www.tudorsociety.com/lady-anne-bacon-nee-cooke-1527-8-1610/ The Tudor Society], 2019. </ref>. The high status of the Tudor family bought wealth and social status to the Bacon family mostly due to her father working with the royal Tudor family.
In a letter dated the 27 of August 1610, Francis wrote to Lady Bacon's close friend Sir Michael Hicks, inviting him to her funeral, so although her exact death date is unknown, it is clearly in the days surrounding this letter<ref name=":0" />. She was about 82 when she died, and was entombed in St Michael's Church, St Albans, where her second son, Sir Francis Bacon was also buried.<ref name=":1" />.
== Marriage ==
Lady Anne Cooke was the second wife of Sir Nicholas Bacon (28 December 1510–20 February 1579), “Queen Elizabeth's Keeper of the Great Seal”<ref name=":0">“Anne Cooke Bacon.” [[wikipedia:Anne_Bacon|Wikipedia]]. 2021.</ref>. The couple had two sons, Anthony (1558–1601) and Francis (22 January 1561 – 9 April 1626). Anthony was a spy and diplomat in the Elizabethan era, while [[wikipedia:Francis_Bacon|Francis Bacon]] became a widely known English philosopher and a pioneer of the scientific revolution. Lady Bacon oversaw their education herself.
== Religion ==
Lady Bacon for a time was a leading Lady-in-Waiting to Queen Elizabeth. Her religious views remained strongly Puritan, and she called for the eradication of all Popery in the Church of England. Most of the letters she exchanged with friends, clergymen and even her husband, are "fervent with her passion for her Protestant beliefs."<ref name=":0" />
Little is known about the later years of Lady Bacon's life, especially following the death of her husband. It seems a mystery, as she wrote very few letters and was not present at many court events, although she did illegally shelter Puritan preachers who lost in licenses in their defiance of the religious politics at the time<ref name=":1">Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. pp. ix. Routledge, 2016. </ref>.
== Works ==
* ''Sermons of Barnardine Ochyne, (to the number of 25.) concerning the predestination and election of god: very expedient to the setting forth of his glory among his creature''.
* ''An apologie or answere in defence of the Churche of Englande, with a briefe and plaine declaration of the true religion professed and used in the same''.
Lady Bacon was a very religious woman, and her main works and letters that are now famously known convey this. In her later years, she mostly wrote letters to her sons, where she is said to express “the jealousy with which she regarded her authority over them long after they had reached manhood,”<ref name=":0" /> although it seems that her main concern was their spiritual welfare and their religious lives.
In her early twenties, she translated and published several volumes of sermons from Bernardino Ochino, an Italian preacher who was very popular with the Italian 'foreigners' Church in England<ref>Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. pp. x. Routledge, 2016.</ref>. Lady Bacon dedicated one such volume to her mother, because of her mother's staunch disapproval of Anne learning Italian and of Roman Catholicism generally<ref>Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. pp. xi-xii. Routledge, 2016.</ref>.
Her translation from the Latin into English of Bishop John Jewel's work of 1564 “''Apology for the Church of England”'' was a significant step in the intellectual justification of Protestantism in England. The work was a clarification of the differences between Anglicanism and Roman Catholicism, and was critical to the support of Elizabeth I's religious policies.<ref>Magnusson, Lynne. "Imagining a National Church: Election and Education in the Works of Anne Cooke Bacon." ''Literature Compass'', vol. 9, no. 3, 2012, p. 242-251. </ref>
==Reputation and legacy==
Bacon's translation of Jewel's ''Apology'' is, to this day, "indispensable to any historical understanding of the Elizabethan Settlement... commissioned by officials who perceived a need for a more definitive rendering of a text that could explain the Elizabethan Settlement to an English readership... [it] was subsequently chained to pulpits throughout England, ensuring long-lasting public access to this crucial treatise."<ref>Goodrich, Jaime. “An Apology or Answer in Defence of the Church of England: Lady Anne Bacon’s Translation of Bishop John Jewel’s.” ''Church History & Religious Culture'', vol. 97, no. 2, 2017, p. 280–302.</ref> Alongside her letters, it also provides a perfect and crucial example of women's writing of this era, and of the fraught, dynamic relationships between varying religious groups and the treatment of those who refused to conform or succumb.
Her legacy can also be found in the achievements of her son, Francis, known as the father of empiricism and a later founder of the scientific method.
== References ==
<references />
== Further reading ==
Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. Routledge, 2016.
Coles, Kimberly Anne. ''Religion, Reform, and Women's Writing in Early Modern England''. Cambridge, UK: Cambridge UP, 2008. Print.
Magnusson, Lynne. "The Rhetoric and Reception of Anne Bacon." English Literary Renaissance 31.1 (2001): 3–33. Print.
Sir Francis Bacon, James Spedding, ''The Letter and Life of Francis Bacon'' – a book about Francis Bacon's life in which letters from Anne to her son are printed.
{{BookCat}}
a6omztd6f44ayu2ulydk10axt95xljy
4669597
4669596
2026-09-10T13:00:11Z
WereSpielChequers
248949
c/e
4669597
wikitext
text/x-wiki
'''Anne Cooke Bacon''', or Lady Bacon, (1527?-1610) was an English Lady of the British Court, scholar and translator. Her exact birthdate is unknown, but estimated to be 1527-8. Many of the details about her life are unknown. Bacon contributed to English religious literature with her English translation of John Jewel's Latin ''Apologie of the Anglican Church'' in 1564.<ref>York, Laura. “Bacon, Anne Cooke 1528 – 1610”. ''Women in World History: A Biographical Encyclopedia.'' [https://www.encyclopedia.com/women/encyclopedias-almanacs-transcripts-and-maps/bacon-anne-cooke-1528-1610 encyclopedia.com]. 2021.</ref>
Bacon was born in Essex, England, as one of nine siblings. Her father, Anthony Cooke, was a tutor to Henry VIII's son Edward Tudor. He was renowned for his progressive attitudes towards women's education, and as a result, ensured that all his children were well-educated in the humanist tradition. Bacon studied languages such as Latin, French, Italian, and Greek as well as literature. All of her sisters had success from Anthony’s teachings, such as Lady Elizabeth Hoby who is also known for translating texts, as well as her poetic and musical talents. The Cooke sisters—Anne, Elizabeth, Mildred, and Katherine—are arguably more famous than the brothers, despite the patriarchal culture of the time that would see them buried<ref>Ridgway, Claire. "Lady Anne Bacon (née Cooke) 1527/8-1610." [https://www.tudorsociety.com/lady-anne-bacon-nee-cooke-1527-8-1610/ The Tudor Society], 2019. </ref>. The high status of the Tudor family bought wealth and social status to the Bacon family mostly due to her father working with the royal Tudor family.
In a letter dated the 27 of August 1610, Francis wrote to Lady Bacon's close friend Sir Michael Hicks, inviting him to her funeral, so although her exact death date is unknown, it is clearly in the days surrounding this letter<ref name=":0" />. She was about 82 when she died, and was entombed in St Michael's Church, St Albans, where her second son, Sir Francis Bacon was also buried.<ref name=":1" />.
== Marriage ==
Lady Anne Cooke was the second wife of Sir Nicholas Bacon (28 December 1510–20 February 1579), “Queen Elizabeth's Keeper of the Great Seal”<ref name=":0">“Anne Cooke Bacon.” [[wikipedia:Anne_Bacon|Wikipedia]]. 2021.</ref>. The couple had two sons, Anthony (1558–1601) and Francis (22 January 1561 – 9 April 1626). Anthony was a spy and diplomat in the Elizabethan era, while [[wikipedia:Francis_Bacon|Francis Bacon]] became a widely known English philosopher and a pioneer of the scientific revolution. Lady Bacon oversaw their education herself.
== Religion ==
Lady Bacon for a time was a leading Lady-in-Waiting to Queen Elizabeth. Her religious views remained strongly Puritan, and she called for the eradication of all Popery in the Church of England. Most of the letters she exchanged with friends, clergymen and even her husband, are "fervent with her passion for her Protestant beliefs."<ref name=":0" />
Little is known about the later years of Lady Bacon's life, especially following the death of her husband. It seems a mystery, as she wrote very few letters and was not present at many court events, although she did illegally shelter Puritan preachers who lost in licenses in their defiance of the religious politics at the time<ref name=":1">Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. pp. ix. Routledge, 2016. </ref>.
== Works ==
* ''Sermons of Barnardine Ochyne, (to the number of 25.) concerning the predestination and election of god: very expedient to the setting forth of his glory among his creature''.
* ''An apologie or answere in defence of the Churche of Englande, with a briefe and plaine declaration of the true religion professed and used in the same''.
Lady Bacon was a very religious woman, and her main works and letters that are now famously known convey this. In her later years, she mostly wrote letters to her sons, where she is said to express “the jealousy with which she regarded her authority over them long after they had reached manhood,”<ref name=":0" /> although it seems that her main concern was their spiritual welfare and their religious lives.
In her early twenties, she translated and published several volumes of sermons from Bernardino Ochino, an Italian preacher who was very popular with the Italian 'foreigners' Church in England<ref>Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. pp. x. Routledge, 2016.</ref>. Lady Bacon dedicated one such volume to her mother, because of her mother's staunch disapproval of Anne learning Italian and of Roman Catholicism generally<ref>Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. pp. xi-xii. Routledge, 2016.</ref>.
Her translation from the Latin into English of Bishop John Jewel's work of 1564 “''Apology for the Church of England”'' was a significant step in the intellectual justification of Protestantism in England. The work was a clarification of the differences between Anglicanism and Roman Catholicism, and was critical to the support of Elizabeth I's religious policies.<ref>Magnusson, Lynne. "Imagining a National Church: Election and Education in the Works of Anne Cooke Bacon." ''Literature Compass'', vol. 9, no. 3, 2012, p. 242-251. </ref>
==Reputation and legacy==
Bacon's translation of Jewel's ''Apology'' is, to this day, "indispensable to any historical understanding of the Elizabethan Settlement... commissioned by officials who perceived a need for a more definitive rendering of a text that could explain the Elizabethan Settlement to an English readership... [it] was subsequently chained to pulpits throughout England, ensuring long-lasting public access to this crucial treatise."<ref>Goodrich, Jaime. “An Apology or Answer in Defence of the Church of England: Lady Anne Bacon’s Translation of Bishop John Jewel’s.” ''Church History & Religious Culture'', vol. 97, no. 2, 2017, p. 280–302.</ref> Alongside her letters, it also provides a perfect and crucial example of women's writing of this era, and of the fraught, dynamic relationships between varying religious groups and the treatment of those who refused to conform or succumb.
Her legacy can also be found in the achievements of her son, Francis, known as the father of empiricism and a later founder of the scientific method.
== References ==
<references />
== Further reading ==
Wayne, Valerie. ''Anne Cooke Bacon: Printed Writings 1500–1640: Series I, Part Two, Volume 1''. Routledge, 2016.
Coles, Kimberly Anne. ''Religion, Reform, and Women's Writing in Early Modern England''. Cambridge, UK: Cambridge UP, 2008. Print.
Magnusson, Lynne. "The Rhetoric and Reception of Anne Bacon." English Literary Renaissance 31.1 (2001): 3–33. Print.
Sir Francis Bacon, James Spedding, ''The Letter and Life of Francis Bacon'' – a book about Francis Bacon's life in which letters from Anne to her son are printed.
{{BookCat}}
opmprdpy3juch99qmia8zrskot0r784
Oberon/System Variants
0
446845
4669618
4659683
2026-09-10T17:48:13Z
WereSpielChequers
248949
typo
4669618
wikitext
text/x-wiki
{{center|[[Oberon/Naming|<span class="mw-ui-button" style="border-style: solid; border-width: 1px; display: inline-block; margin: auto; width: 13em; text-align: center; Background-color:#F0FFFF;{{Text color default}};">← Naming</span>]] [[Oberon|<span class="mw-ui-button" style="border-style: solid; border-width: 1px; display: inline-block; margin: auto; width: 13em; text-align: center; Background-color:#F0FFFF;{{Text color default}};">↑ Oberon front page</span>]] [[Oberon/Licenses|<span class="mw-ui-button" style="border-style: solid; border-width: 1px; display: inline-block; margin: auto; width: 13em; text-align: center; Background-color:#F0FFFF;{{Text color default}};">Licenses →</span>]]}}
<br>
The Oberon system runs directly on several machine architectures and as a subsystem in several host [[w:Operating system|operating systems]]. Order of rows is approximately chronological. For each variant (row), a link in the second column leads to additional information.
<div id="VariantsTable"></div>
==Source Texts in [[Oberon/oreport|Oberon]]<ref name="Oberon"/>==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| colspan="4" align="center" | Presentation as a table 
|-
! style="width: 15em" | Host Environment<ref name="HostEnvironment"/>
! style="width: 15em" | Software
! style="width: 15em" | Installation<br>archive
! style="width: 15em" | Installation<br>Instructions
|-
| [[w:Ceres_(workstation)|Ceres workstation]]<br>
[http://www.computerhistory.org/collections/catalog/X2321.2002A preserved Ceres]<br>
[http://www.computerhistory.org/collections/catalog/102674736 preserved Ceres]<br>
[http://www.computerhistory.org/collections/catalog/102722173 photo of Ceres 1]<br>
[[w:Field-programmable_gate_array|FPGA]] based [https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165&No=830#contents Cyclone V GX].
| [[w:Oberon_(operating_system)|The Oberon System]]<br>[[Oberon/The Oberon System, V1 and V2|V1 and V2]]
| colspan="2" align="center" | [http://www.cpu-ns32k.net/Oberon.html Notes about Oberon] and [http://www.cpu-ns32k.net/Ceres.html implementation of Ceres]<!-- <br>by Udo Möller, 2023-25. --><ref name="VCFE2024"/><ref name="Ceres"/><br>[https://github.com/pcayuela/Project-Oberon/tree/main/CERES%20Oberon%20V4/ASCII Project-Oberon at Sourceforge]<br>[https://bitsavers.org/ETH https://bitsavers.org/ETH]
|-
| [[w:X86|X86 PC]] with [[w:MS_DOS|MS-DOS]] or [[w:FreeDOS|compatible OS]]
| [https://www.research-collection.ethz.ch/handle/20.500.11850/68911 ''Oberon for PC on an MS-DOS Base''](PDF), [[Oberon/Bibliography#Dis93|Dis93]]
| align="center" | [https://sourceforge.net/projects/dosoberon/files/ Sourceforge]<br>[https://github.com/Classic-Tools/DOSOberon Github]
| align="center" | README.TXT for System 3, Release 2.0 at [https://sourceforge.net/projects/dosoberon/files/DOS%20Oberon%20System%203%20Version%202.0/ Sourceforge],<br>and at [https://github.com/Classic-Tools/DOSOberon/blob/master/DOSOberon-S3R2.0/README.TXT Github]
|-
| Any system compatible with the included PAL library<ref name="PAL"/>
| Cross-platform ETH Oberon, System 3<ref name="Oberon"/>
| colspan="2" align="center" | [https://github.com/rochus-keller/OberonSystem3/ github]<ref name="PrecompiledCrossPlatformOberon"/>
|-
| Any system providing [[w:ARM_architecture_family#32-bit_architecture|ARMv7]] capabilities, including [[w:Raspberry_Pi#Flagship_series|Raspi 2B, 3b & Zero2]].<ref name="ARM"/>
|QEMU image and software operable on various Raspberry Pi machines.
| colspan="2" align="center" | [https://github.com/rochus-keller/OberonSystem3Native/releases/tag/2026-04-02 Github].
|}
{{:Oberon/ThreeBoxes
|'''Host Environment'''<ref name="HostEnvironment"/>
|'''Software'''
|'''Installation'''
|25px}}
{{:Oberon/ThreeBoxes
|[[w:Ceres_(workstation)|Ceres workstation]].<br>
[http://www.computerhistory.org/collections/catalog/X2321.2002A Preserved Ceres].<br>
[http://www.computerhistory.org/collections/catalog/102674736 Preserved Ceres].
|[[w:Oberon_(operating_system)|The Oberon System]],<br>
[[Oberon/The Oberon System, V1 and V2|V1 and V2]].
|[http://www.cpu-ns32k.net/Oberon.html Notes about Oberon] and [http://www.cpu-ns32k.net/Ceres.html implementation of Ceres].<ref name="VCFE2024"/><ref name="Ceres"/><br>
[https://github.com/pcayuela/Project-Oberon/tree/main/CERES%20Oberon%20V4/ASCII Project-Oberon at Sourceforge].
|77px}}
{{:Oberon/ThreeBoxes
|[[w:X86|X86 PC]] with [[w:MS_DOS|MS-DOS]] or [[w:FreeDOS|compatible OS]].
|[https://www.research-collection.ethz.ch/handle/20.500.11850/68911 ''Oberon for PC on an MS-DOS Base''](PDF), [[Oberon/Bibliography#Dis93|Dis93]].
|README.TXT for System 3, Release 2.0 at [https://sourceforge.net/projects/dosoberon/files/DOS%20Oberon%20System%203%20Version%202.0/ Sourceforge].<br>
At [https://github.com/Classic-Tools/DOSOberon/blob/master/DOSOberon-S3R2.0/README.TXT Github].
|75px}}
{{:Oberon/ThreeBoxes
|Any system compatible with the included PAL library.<ref name="PAL"/>
|Cross-platform ETH Oberon, System 3.<ref name="Oberon"/>
|[https://github.com/rochus-keller/OberonSystem3/ Github].<ref name="PrecompiledCrossPlatformOberon"/>
|46px}}
{{:Oberon/ThreeBoxes
| Any system providing [[w:ARM_architecture_family#32-bit_architecture|ARMv7]] capabilities, including [[w:Raspberry_Pi#Flagship_series|Raspi 2B, 3b & Zero2]].<ref name="ARM"/>
| QEMU image and software operable on various Raspberry Pi machines.
| [https://github.com/rochus-keller/OberonSystem3Native/releases/tag/2026-04-02 Github].
| 68px}}
==Source Texts in [https://cseweb.ucsd.edu/~wgg/CSE131B/oberon2.htm Oberon-2]==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| colspan="4" align="center" | Presentation as a table 
|-
! colspan="4" align="center" <!-- style="border-top: solid 2px" --> | Source Texts in [https://cseweb.ucsd.edu/~wgg/CSE131B/oberon2.htm Oberon-2]
|-
! style="width: 15em" | Host Environment<ref name="HostEnvironment"/>
! style="width: 15em" | Software
! style="width: 15em" | Installation<br>archive
! style="width: 15em" | Installation<br>Instructions
|- <!-- id="ETHO" -->
|Bare [[w:X86|X86 PC]]<ref name="Transmeta"/>
| [[Oberon/ETH Oberon|ETH Oberon]], formerly System 3, PC-Native Oberon.<br />[[w:Oberon_(operating_system)#Native_Oberon| Wikipedia]]
| align="center" | [https://sourceforge.net/projects/nativeoberon/files/nativeoberon/ SourceForge]
| align="left" | [[Oberon/ETH Oberon/install|ETHZ, actual diskettes]]<br>
[[Oberon/ETH_Oberon/QEMUinstall|Hypervisor using diskette images]].<br>
[https://www.youtube.com/watch?v=Do2O1yFrnos Oberon Tutorials] at YouTube<ref name="YouTube"/>
|-
| [[w:X86|X86 PC]] with [[w:MS_DOS|MS-DOS]] or [[w:FreeDOS|compatible OS]]
| DOS Oberon System3, Version 2.0, [[Oberon/Bibliography#Dis93|Dis93]]<ref name="DOS"/>
| align="center" | [https://sourceforge.net/projects/dosoberon/files/DOS%20Oberon%20System%203%20Version%202.0/ SourceForge]<br />[https://github.com/Classic-Tools/DOSOberon/tree/master/DOSOberon-S3R2.0 Github]
| align="center" | [https://sourceforge.net/projects/dosoberon/files/DOS%20Oberon%20System%203%20Version%202.0/README.TXT/download SourceForge]<br />[https://github.com/Classic-Tools/DOSOberon/blob/master/DOSOberon-S3R2.0/README.TXT Github]
|-
| X86 PC with MS Windows
| ETH Oberon for Windows<ref name="Windows"/>
| align="center" | [https://github.com/pcayuela/oldftpETHZOberon/tree/master/System3/Win95NT Github]<ref name="Win95NT"/>
| align="center" | [https://github.com/pcayuela/oldftpETHZOberon/tree/master/System3/Win95NT/PlugIn readme.txt]
|-
| HP Alpha [aka DEC AXP] with OpenVMS
| [http://www.modulaware.com/mwovms.htm 64 bit (Linz-)Oberon System], [[Oberon/Linz Oberon, V4|V4]]
| align="center" | [http://www.modulaware.com/zel/aos/ modulaware.com]
| align="center" | [http://www.modulaware.com/zel/aos/ OpenVMS Alpha]
|-
| X86, ARM, ARMv7,<br>[[w:RISC-V|RISC-V]] or [[w:MIPS_architecture|MIPS]] with Linux
| [http://oberon.wikidot.com/oberon-linux-revival-olr Oberon Linux Revival, OLR]<ref name="OLR"/>
| colspan="2" align="center" | [http://oberon.wikidot.com/ P. Matthias]
|-
| X86 PC with Linux, UltraSPARC with Solaris or Sun3 with SunOS
| [http://www.mathematik.uni-ulm.de/oberon/ Ulm Oberon]
| colspan="2" align="center" | [http://www.mathematik.uni-ulm.de/oberon/ulm.html HTML page] and manual pages in the downloads
|- <!-- id="V4" -->
| X86 PC with various operating systems<ref name="Linz"/>
| [http://ssw.jku.at/Research/Projects/Oberon.html Linz-Oberon], [[Oberon/Linz Oberon, V4|V4]]
| align="center" | [http://olymp.idle.at/tanis/oberon.linux.html olymp.idle.at]<ref name="olymp"/> and [https://sourceforge.net/projects/oberon/files/ SourceForge]
| align="center" | [http://olymp.idle.at/~tanis/INSTALL INSTALL at olymp.idle.at]<br>[https://sourceforge.net/p/oberon/wiki/Home/ Wiki at Sourceforge]. [https://github.com/btreut/Oberon4Linux-Bootstrap Update for the x86-64 PC].
|-
| X86 PC with Windows or with *nix and Wine
| [[w:BlackBox Component Builder|BlackBox Component Builder]], an [[w:Integrated_development_environment|IDE]] for [[w:Component_Pascal|Component Pascal]]
<!-- | [[/BB/]] -->
| colspan="2" align="center" | [https://github.com/BlackBoxCenter BB Component Builder download].
|-
| [[w:Common Language Infrastructure|.NET and CLI]]
| [[w:Component_Pascal|Gardens Point Component Pascal, GPCP]] application for .NET and CLI<ref name="GPCP"/>
| colspan="2" align="center" | [https://github.com/k-john-gough/gpcp Current project at github] <br> [https://web.archive.org/web/20120911105411/http://plas.fit.qut.edu.au/gpcp/ Original site from Archive.org]
|-
| [[w:Java Virtual Machine|JVM]]
| [[w:Component_Pascal|Gardens Point Component Pascal]] application for JVM<ref name="GPCP"/>
| colspan="2" align="center" | [https://github.com/k-john-gough/gpcp Current project at github] <br> [https://web.archive.org/web/20120911105411/http://plas.fit.qut.edu.au/gpcp/ Original site from Archive.org]
|-
| [[w:Linux|Linux]]-[[w:IA-32|386]], [[w:Raspberry_Pi_OS|Rasbian]], [[w:Microsoft_Windows|Windows]]
| Ofront Oberon to C translator
| colspan="2" align="center" | Josef Templ, [https://github.com/jtempl/ofront/ github]
|-
| [[w:Linux|Linux]], [[w:OS X|OS X]] or [[w:MS Windows|MS Windows]]
| [https://ecs.openbrace.org/ Eigen Compiler Suite]
| align="center" | [https://ecs.openbrace.org/releases/ Releases]
| align="center" | [https://ecs.openbrace.org/manual User Manual]
|-
| Subsystem for Blackbox
| Ofront+ Oberon to C translator
| align="center" | various Oberon dialects
| colspan="2" align="center" | [https://github.com/Oleg-N-Cher/OfrontPlus/ github]
|}
{{User:PeterEasthope/ThreeBoxes
|'''Host Environment'''<ref name="HostEnvironment"/>
|'''Software'''
|'''Installation'''
|25px}}
<div id="ETHO">{{User:PeterEasthope/ThreeBoxes
|1=Bare [[w:X86|X86 PC]]<ref name="Transmeta"/>
|2=[[Oberon/ETH Oberon|ETH Oberon]], formerly System 3, PC-Native Oberon. [[w:Oberon_(operating_system)#Native_Oberon|Wikipedia]] 
|3=[https://sourceforge.net/projects/nativeoberon/files/nativeoberon/ SourceForge]. [[Oberon/ETH_Oberon/install|ETHZ, real diskettes]]. [[Oberon/ETH_Oberon/QEMUinstall|Hypervisor with diskette images]]. [https://www.youtube.com/watch?v=Do2O1yFrnos Oberon Tutorials at YouTube]<ref name="YouTube"/>
|4=90px}}</div>
{{User:PeterEasthope/ThreeBoxes
| [[w:X86|X86 PC]] with [[w:MS-DOS|MS-DOS]] or [[w:FreeDOS|compatible OS]]
| DOS Oberon System3, Version 2.0, [[Oberon/Bibliography#Dis93|Dis93]]<ref name="DOS"/>
| [https://sourceforge.net/projects/dosoberon/files/DOS%20Oberon%20System%203%20Version%202.0/ SourceForge] and [https://github.com/Classic-Tools/DOSOberon/tree/master/DOSOberon-S3R2.0 Github]
| 50px}}
{{b:User:PeterEasthope/ThreeBoxes
| X86 PC with MS Windows
| ETH Oberon for Windows<ref name="Windows"/>
| [https://github.com/pcayuela/oldftpETHZOberon/tree/master/System3/Win95NT Github]<ref name="Win95NT"/> including [https://github.com/pcayuela/oldftpETHZOberon/tree/master/System3/Win95NT/PlugIn readme.txt].
| 50px}}
{{b:User:PeterEasthope/ThreeBoxes
| HP Alpha [aka DEC AXP] with OpenVMS
| [http://www.modulaware.com/mwovms.htm 64 bit (Linz-)Oberon System], [[Oberon/Linz Oberon, V4|V4]]
| [http://www.modulaware.com/zel/aos/ modulaware.com, OpenVMS Alpha]
| 45px}}
{{b:User:PeterEasthope/ThreeBoxes
| X86, ARM, ARMv7,<br>[[w:RISC-V|RISC-V]] or [[w:MIPS_architecture|MIPS]] with Linux
| [http://oberon.wikidot.com/oberon-linux-revival-olr Oberon Linux Revival, OLR]<ref name="OLR"/>
| [http://oberon.wikidot.com/ P. Matthias]
| 45px}}
{{b:User:PeterEasthope/ThreeBoxes
| X86 PC with Linux, UltraSPARC with Solaris or Sun3 with SunOS
| [http://www.mathematik.uni-ulm.de/oberon/ Ulm Oberon]
| [http://www.mathematik.uni-ulm.de/oberon/ulm.html HTML page] and manual pages in the downloads
| 45px}}
<div id="V4">{{b:User:PeterEasthope/ThreeBoxes
| X86 PC with various operating systems<ref name="Linz"/>
| [http://ssw.jku.at/Research/Projects/Oberon.html Linz-Oberon], [[Oberon/Linz Oberon, V4|V4]]
| [http://olymp.idle.at/tanis/oberon.linux.html olymp.idle.at]<ref name="olymp"/>. [https://sourceforge.net/projects/oberon/files/ SourceForge]. [http://olymp.idle.at/~tanis/INSTALL INSTALL at olymp.idle.at]. [https://sourceforge.net/p/oberon/wiki/Home/ Wiki at Sourceforge]. [https://github.com/btreut/Oberon4Linux-Bootstrap Update for the x86-64 PC].
| 85px}}</div>
{{b:User:PeterEasthope/ThreeBoxes
| X86 PC with Windows or with *nix and Wine
| [[w:BlackBox Component Builder|BlackBox Component Builder]], an [[w:Integrated_development_environment|IDE]] for [[w:Component_Pascal|Component Pascal]].
| [https://github.com/BlackBoxCenter BB Component Builder download].
| 45px}}
{{b:User:PeterEasthope/ThreeBoxes
| [[w:Common Language Infrastructure|.NET and CLI]]
| [[w:Component_Pascal|Gardens Point Component Pascal, GPCP]] application for .NET and CLI<ref name="GPCP"/>
| [https://github.com/k-john-gough/gpcp Current project at github]<br> [https://web.archive.org/web/20120911105411/http://plas.fit.qut.edu.au/gpcp/ Original site from Archive.org]
| 65px}}
{{b:User:PeterEasthope/ThreeBoxes
| [[w:Java Virtual Machine|JVM]]
| [[w:Component_Pascal|Gardens Point Component Pascal]] application for JVM<ref name="GPCP"/>
| [https://github.com/k-john-gough/gpcp Current project at github] <br> [https://web.archive.org/web/20120911105411/http://plas.fit.qut.edu.au/gpcp/ Original site from Archive.org]
| 45px}}
{{b:User:PeterEasthope/ThreeBoxes
| [[w:Linux|Linux]]-[[w:IA-32|386]], [[w:Raspberry_Pi_OS|Rasbian]], [[w:Microsoft_Windows|Windows]]
| Ofront Oberon to C translator
| Josef Templ, [https://github.com/jtempl/ofront/ github]
| 25px}}
{{b:User:PeterEasthope/ThreeBoxes
| [[w:Linux|Linux]], [[w:OS X|OS X]] or [[w:MS Windows|MS Windows]]
| [https://ecs.openbrace.org/ Eigen Compiler Suite]
| [https://ecs.openbrace.org/releases/ Releases] and [https://ecs.openbrace.org/manual User Manual].
| 25px}}
{{b:User:PeterEasthope/ThreeBoxes
| Subsystem for Blackbox
| Ofront+ Oberon to C translator
| [https://github.com/Oleg-N-Cher/OfrontPlus/ OfrontPlus at github] for various Oberon dialects.
| 45px}}
==Source Texts in [https://gitlab.inf.ethz.ch/felixf/oberon/-/tree/main/docu Active Oberon]==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| colspan="4" align="center" | Presentation as a table 
|-
! style="width: 15em" | Host Environment<ref name="HostEnvironment"/>
! style="width: 15em" | Software
! style="width: 15em" | Installation<br>archive
! style="width: 15em" | Installation<br>Instructions
|- <!-- id="A2" -->
| Bare [[w:X86|X86 PC]].
| [[Oberon/A2|A2 = AOS = Bluebottle]],<br />[[w:Bluebottle_OS|Bluebottle in Wikipedia]].
| align="center" | [https://sourceforge.net/projects/a2oberon/files/ SourceForge].
| align="center" | [[Oberon/A2#The_A2_Repository|Contemporary instructions]].<ref name="portability"/>
|-
| X86 PC with Solaris,<br>Linux or MacOSX (Darwin).
| [[Oberon/A2#Installing_and_Running_UnixAOS|UnixAos = UnixA2]].
| align="center" | [http://www.informatik.uni-bremen.de/~fld/UnixAos/ Uni-Bremen, G. Feldmann].
| align="center" | [http://www.informatik.uni-bremen.de/~fld/UnixAos/Readme.txt Readme.txt].
|-
| X86 PC with A2 or UnixA2 or WinA2.
| [[Oberon/A2#Oberon_Subsystem|Oberon subsystem of A2]].
| colspan="2" align="center" | Included in A2, UnixA2 and WinA2.
|-
|}
{{User:PeterEasthope/ThreeBoxes
|'''Host Environment'''<ref name="HostEnvironment"/>
|'''Software'''
|'''Installation'''
|25px}}
<div id="A2">{{User:PeterEasthope/ThreeBoxes
| Bare [[w:X86|X86 PC]].
| [[Oberon/A2|A2 = AOS = Bluebottle]].<br>[[w:Bluebottle_OS|Bluebottle in Wikipedia]].
| [https://sourceforge.net/projects/a2oberon/files/ SourceForge].<br>[[Oberon/A2#Installing_and_Running_UnixAOS|Contemporary instructions]].<ref name="portability"/>
| 50px}}</div>
{{User:PeterEasthope/ThreeBoxes
| X86 PC with Solaris,<br>Linux or MacOSX (Darwin).
| [[Oberon/A2#Installing_and_Running_UnixAOS|UnixAos = UnixA2]].
| [http://www.informatik.uni-bremen.de/~fld/UnixAos Uni-Bremen, G. Feldmann]. [http://www.informatik.uni-bremen.de/~fld/UnixAos/Readme.txt Readme.txt].
| 50px}}
{{User:PeterEasthope/ThreeBoxes
| X86 PC with A2 or UnixA2 or WinA2.
| [[Oberon/A2#Oberon_Subsystem|Oberon subsystem of A2]].
| Included in A2, UnixA2 and WinA2.
| 50px}}
==Source Texts in [https://people.inf.ethz.ch/wirth/Oberon/index.html Oberon-07]==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| colspan="4" align="center" | Presentation as a table 
|-
! style="width: 15em" | Host Environment<ref name="HostEnvironment"/>
! style="width: 15em" | Software
! style="width: 15em" | Installation<br>archive
! style="width: 15em" | Installation<br>Instructions
|-
| <!-- id="V5" --> | [[w:Field-programmable_gate_array|FPGA]] [[w:Reduced_instruction_set_computer|RISC]]
| [[Oberon/V5|V5]],<br>[[w:Oberon_(operating_system)#Project_Oberon_2013|Oberon V5]] in Wikipedia
| colspan="2" align="center" | [https://www.inf.ethz.ch/personal/wirth/ N. Wirth]<br>[http://www.projectoberon.net/ P. Reed]
|-
| <!-- id="RISCemu" --> | [[Oberon/Android]], [[w:Linux|Linux]],<br>
[[w:MacOS|Mac OS X]], [[w:Unix|Unix]] or<br>
[[w:Windows_NT|MS Windows]] on a wide variety of machines<ref name="RISCemuRequirements"/>
| RISC Emulator written in C.
| align="center" colspan="2" rowspan="2" | [https://github.com/pdewacht/oberon-risc-emu P. De Wachter]
|-
| Unix command line
| Norebo<ref name="norebo"/>
<!-- | colspan="2" align="center" | [https://github.com/pdewacht/project-norebo P. De Wachter] -->
|-
| <!-- id="ExtendedOberon" --> | Oberon [[w:Reduced_instruction_set_computer|RISC]] processor or emulation of it<ref name="ExtOberonFootnote"/>
| [[Oberon/Extended_Oberon|Extended Oberon]]
| colspan="2" align="center" | A. Pirklbauer<br>[https://github.com/andreaspirklbauer/Oberon-extended/blob/master/README.md README] [https://github.com/andreaspirklbauer/Oberon-extended/blob/master/Documentation/ Documentation]<br>[https://github.com/andreaspirklbauer/Oberon-extended Oberon{{nbhyph}}extended]<ref name="ExtOberonName"/><br>[https://github.com/andreaspirklbauer/Oberon-retro-compiler Oberon-retro-compiler]
|-
| [[w:Web_browser|Web browser]]
| Emulator written in [[w:JavaScript|JavaScript]].
| rowspan="2" colspan="2" align="center" | [https://github.com/schierlm/OberonEmulator/ Michael Schierl].
|-
| [[w:Web_browser|Web browser]]
| Emulator written in [[w:Java_(programming language)|Java]].
|-
| [[w:Linux|Linux]] or [[w:MacOS|Mac OS]]
| [https://github.com/io-core/io/ Integrated Oberon] with an emulator written in the [[w:Go_(programming_language)|Go programming language]].
| colspan="2" align="center" | [https://github.com/io-core/io/ Charles Perkins]
|-
| <!-- id="POL" --> | ARMv7, [[w:RISC-V|RISC-V]] or [[w:MIPS_architecture|MIPS]] running Linux.
[[w:RISC-V|RISC-V]] running [[w:FreeRTOS|FreeRTOS]] on Sipeed M1s, Linux 32bit and Linux 64bit.
| Project Oberon Linux, POL;<br>Using native compiler and Linux Kernel functions.
| align="center" colspan="2" rowspan="2" | [http://oberon.wikidot.com/ P. Matthias]
|-
| rowspan="2" | [[w:Java Virtual Machine|JVM]]
| Project Oberon using oberonc compiler from L. Boasso
<!-- | colspan="2" |P. Matthias -->
|-
| [https://github.com/lboasso/oberonc Oberonc] compiler for Oberon-07.<ref name="TypeRules"/>
| colspan="2" align="center" | [https://github.com/io-core/io/ L. Boasso]
|-
| Any system capable of running QEMU
| [https://github.com/io-core/qemu-risc6 qemu-risc6] fork of QEMU
| colspan="2" align="center" | [https://github.com/io-core/ Charles Perkins].
|-
| Any system capable of running [https://github.com/aixp/ProjectOberon-BlackBox BlackBox Component Builder]
| Oberon-07 compiler written in Oberon-2.
| colspan="2" align="center" | [https://github.com/aixp/ProjectOberon-BlackBox Alexander V. Shiryaev]
|-
| [[w:Linux|Linux]], [[w:OS X|OS X]] or [[w:MS Windows|MS Windows]]
| [https://github.com/solbjorg/oberon-riscv-emu oberon-riscv-emu]
| align="center" colspan="2" rowspan="2" | [https://github.com/solbjorg/oberon-riscv-emu Rikke Solbjørg]
|-
| [[w:Linux|Linux]], [[w:OS X|OS X]] or [[w:MS Windows|MS Windows]] with [https://github.com/solbjorg/oberon-riscv-emu oberon-riscv-emu] or a bare [[w:RISC-V|RISC-V]] machine.
| [https://github.com/solbjorg/oberon-riscv oberon-riscv]
<!-- | colspan="2" align="center" | [https://github.com/solbjorg/oberon-riscv Rikke Solbjørg] -->
|}
{{User:PeterEasthope/ThreeBoxes
|'''Host Environment'''<ref name="HostEnvironment"/>
|'''Software'''
|'''Installation'''
|25px}}
<div id="V5">{{User:PeterEasthope/ThreeBoxes
| [[w:Field-programmable_gate_array|FPGA]] [[w:Reduced_instruction_set_computer|RISC]]
| [[Oberon/V5|V5]] and [[w:Oberon_(operating_system)#Project_Oberon_2013|Oberon V5]] in Wikipedia.
| [https://www.inf.ethz.ch/personal/wirth/ N. Wirth], [http://www.projectoberon.net/ P. Reed].
| 25px}}</div>
<div id="RISCemu">{{User:PeterEasthope/ThreeBoxes
| [[Oberon/Android]], [[w:Linux|Linux]], [[w:Windows_NT|MS Windows]], [[w:MacOS|Mac OS X]] or [[w:Unix|Unix]] on a wide variety of machines<ref name="RISCemuRequirements"/>
| RISC Emulator written in C.
| [https://github.com/pdewacht/oberon-risc-emu P. De Wachter]
| 70px}}</div>
{{User:PeterEasthope/ThreeBoxes
| Unix command line
| Norebo<ref name="norebo"/>
| [https://github.com/pdewacht/project-norebo P. De Wachter]
| 25px}}
<div id="ExtendedOberon">{{User:PeterEasthope/ThreeBoxes
| Oberon [[w:Reduced_instruction_set_computer|RISC]] processor or emulation of it<ref name="ExtOberonFootnote"/>
| [[Oberon/Extended_Oberon|Extended Oberon]]
| A. Pirklbauer, [https://github.com/andreaspirklbauer/Oberon-extended/blob/master/README.md README], [https://github.com/andreaspirklbauer/Oberon-extended/blob/master/Documentation/ Documentation], [https://github.com/andreaspirklbauer/Oberon-extended Oberon{{nbhyph}}extended]<ref name="ExtOberonName"/> and [https://github.com/andreaspirklbauer/Oberon-retro-compiler Oberon-retro-compiler].
| 90px}}</div>
{{User:PeterEasthope/ThreeBoxes
| [[w:Web_browser|Web browser]]
| Emulator written in [[w:JavaScript|JavaScript]].
| [https://github.com/schierlm/OberonEmulator/ Michael Schierl].
| 25px}}
{{User:PeterEasthope/ThreeBoxes
| [[w:Web_browser|Web browser]]
| Emulator written in [[w:Java_(programming language)|Java]].
| [https://github.com/schierlm/OberonEmulator/ Michael Schierl].
| 25px}}
{{User:PeterEasthope/ThreeBoxes
| [[w:Linux|Linux]] or [[w:MacOS|Mac OS]]
| [https://github.com/io-core/io/ Integrated Oberon] with an emulator written in the [[w:Go_(programming_language)|Go programming language]].
| [https://github.com/io-core/io/ Charles Perkins]
| 67px}}
<div id="POL">{{User:PeterEasthope/ThreeBoxes
| ARMv7, [[w:RISC-V|RISC-V]] or [[w:MIPS_architecture|MIPS]] running Linux. [[w:RISC-V|RISC-V]] running [[w:FreeRTOS|FreeRTOS]] on [https://dl.sipeed.com/fileList/MAIX/HDK/Sipeed-M1&M1W/Specifications/Sipeed%20M1%20Datasheet%20EN%20V1.12.pdf Sipeed M1s] and Linux 32bit or Linux 64bit.<ref name="POV"/>
| [http://oberon.wikidot.com/project-oberon-v Project Oberon Linux, POL];<br>Using native compiler and Linux Kernel functions.
| [http://oberon.wikidot.com/ P. Matthias]
| 90px}}</div>
{{User:PeterEasthope/ThreeBoxes
| [[w:Java Virtual Machine|JVM]]
| Project Oberon using oberonc compiler from L. Boasso
| [http://oberon.wikidot.com/ P. Matthias]
| 45px}}
{{User:PeterEasthope/ThreeBoxes
| [[w:Java Virtual Machine|JVM]]
| [https://github.com/lboasso/oberonc Oberonc] compiler for Oberon-07.<ref name="TypeRules"/>
| [https://github.com/io-core/io/ L. Boasso]
| 45px}}
{{User:PeterEasthope/ThreeBoxes
| Any system capable of running QEMU
| [https://github.com/io-core/qemu-risc6 qemu-risc6] fork of QEMU
| [https://github.com/io-core/ Charles Perkins].
| 45px}}
{{User:PeterEasthope/ThreeBoxes
| Any system capable of running [https://github.com/aixp/ProjectOberon-BlackBox BlackBox Component Builder]
| Oberon-07 compiler written in Oberon-2.
| [https://github.com/aixp/ProjectOberon-BlackBox Alexander V. Shiryaev]
| 45px}}
{{User:PeterEasthope/ThreeBoxes
| [[w:Linux|Linux]], [[w:OS X|OS X]] or [[w:MS Windows|MS Windows]]
| [https://github.com/solbjorg/oberon-riscv-emu oberon-riscv-emu]
| [https://github.com/solbjorg/oberon-riscv-emu Rikke Solbjørg]
| 25px}}
{{User:PeterEasthope/ThreeBoxes
| [[w:Linux|Linux]], [[w:OS X|OS X]] or [[w:MS Windows|MS Windows]] with [https://github.com/solbjorg/oberon-riscv-emu oberon-riscv-emu] or a bare [[w:RISC-V|RISC-V]] machine.
| [https://github.com/solbjorg/oberon-riscv oberon-riscv]
| [https://github.com/solbjorg/oberon-riscv Rikke Solbjørg]
| 67px}}
==Footnotes==
{{Reflist|refs=
<ref name="Oberon">The Oberon language evolved through several variations including [https://people.inf.ethz.ch/wirth/Oberon/Oberon.Report.pdf Oberon-90] in which Cross-platform Oberon is written. The differences between the latest 1990 version of Oberon and the 1991 superset, Oberon-2, are explained in bibliography references [[Oberon/authors#M|Moe91]] and [[Oberon/authors#M|MoW91a]].</ref>
<ref name="HostEnvironment">In some cases the host environment is a bare machine. Otherwise it is a machine running another system.</ref>
<ref name="VCFE2024">[https://www.youtube.com/watch?v=cEdHiE-HoGE&t=2145s Presentation at VCFE 23.0], September 2024. Jump to 35:46.</ref>
<ref name="Ceres">Hypothetically a Ceres can also be built with [http://cpu-ns32k.net/Gilbert.html wire wrap].</ref>
<ref name="PrecompiledCrossPlatformOberon">Links to precompiled images for MS Windows, Linux and MacOS are at the bottom of the Github page.</ref>
<ref name="PAL">PAL = Platform Abstraction Layer written by Rochus Keller and included with Cross-platform Oberon. Precompiled systems are currently available for Linux x86 & x64, Mac M1 & x64 and Windows x86 & x64. Porting to another system is primarily porting the PAL library.</ref>
<ref name="ARM">ARMv8 processors are backward compatible to v7.</ref>
<ref name="Transmeta">Including the [[w:Transmeta_Crusoe|Transmeta Crusoe 5400]] and the [[w:StrongARM|StrongARM SA 110 and SA 1110]].</ref>
<ref name="YouTube">A PC can boot from an Oberon0 diskette in an internal drive. In that case installation of ETH Oberon can proceed directly without involvement of DOS. Part 2 in the series includes a helpful explanation of the user interface.</ref>
<ref name="DOS">Sources for [https://github.com/Project-Oberon/Source-Code/tree/main/DOS%20Oberon%20System%203%20Release%202.0 Release 2.0] are available. ASCII sources can be read with any contemporary editor. The Text sources should be read in an Oberon system; otherwise display by Linux gedit may be tolerable.</ref>
<ref name="Windows">Also referred to as "ETH Oberon Plugin for Windows" and "Spirit of Oberon System3 for Windows".</ref>
<ref name="Win95NT">A server at ftp://ftp.ssw.uni-linz.ac.at/ remains accessible to an FTP client and installation archives can be retrieved. The Firefox browser is unable to navigate into the subdirectories.</ref>
<ref name="OLR">Sources following ETH Oberon closely. Note "Current state ... network not working."</ref>
<ref name="Linz">V4 can also execute on obsolete systems [[w:Motorola_68000_series|680x0 MacIntosh]] and [[w:PowerMac|PowerMac]] with [[w:MacOS|MacOS]] to version 9 inclusive, [[w:Amiga|Amiga]], [[w:Atari_ST|Atari ST]], [[w:DECstation|DECstation]], [[w:HPUX|HP-UX]], [[w:IBM_RISC_Dystem/6000|IBM RS/6000]], [[w:SGI_IRIS|SGI IRIS]] and [[w:Sparc|SPARC]] with [[w:Solaris_(operating_system)|Solaris]]. Refer to [https://sourceforge.net/projects/oberon/ https://sourceforge.net/projects/oberon/] and [https://ssw.jku.at/Research/Projects/Oberon.html https://ssw.jku.at/Research/Projects/Oberon.html]. A native version has not been produced.</ref>
<ref name="olymp">olymp.idle.at has version 1.7.02. The last version at JKU Linz is 1.5.</ref>
<ref name="GPCP">GPCP provides a compiler for Component Pascal; not a full Oberon subsystem.</ref>
<ref name="portability">During the summer of 2019 work was underway at the ETHZ to improve portability and other aspects. Until the work is completed, the user may encounter difficulties with the native variant of A2. The Oberon subsystem remains available in UnixA2 and WinA2. A notice was in the [http://lists.inf.ethz.ch/pipermail/oberon/ mailing list at 2019-07-03]. Patience is advised.</ref>
<ref name="RISCemuRequirements">The SDL2 library and a C99 capable C compiler are required. GCC or Clang suffice for compiling the emulator.</ref>
<ref name="norebo">A software allowing execution of an Oberon command without the Oberon system and interface. The Oberon compiler, for example, can be executed at the Unix command line.</ref>
<ref name="ExtOberonFootnote">Extended Oberon does not modify the RISC processor; it modifies only the Oberon system which runs on it.</ref>
<ref name="ExtOberonName">Nomenclature explained in the [https://lists.inf.ethz.ch/pipermail/oberon/2023/016552.html Oberon mailing list at 2023-01-18].</ref>
<ref name="POV"><!-- <[https://lists.inf.ethz.ch/pipermail/oberon/2026/??.html Reply from Peter Mathias to the Oberon list at 2026.07.02.]</ref> -->
<ref name="TypeRules">The [https://github.com/lboasso/oberonc/blob/master/doc/TypeRules.md TypeRules document] is noteworthy. Specific aspects of [[w:Data_type|types]] are discussed in the [http://lists.inf.ethz.ch/pipermail/oberon/ mailing list] beginning at 2019-12-07.</ref>
}}
<br>
{{center|[[Oberon/Naming|<span class="mw-ui-button" style="border-style: solid; border-width: 1px; display: inline-block; margin: auto; width: 13em; text-align: center; Background-color:#F0FFFF;{{Text color default}};">← Naming</span>]] [[Oberon|<span class="mw-ui-button" style="border-style: solid; border-width: 1px; display: inline-block; margin: auto; width: 13em; text-align: center; Background-color:#F0FFFF;{{Text color default}};">↑ Oberon front page</span>]] [[Oberon/Licenses|<span class="mw-ui-button" style="border-style: solid; border-width: 1px; display: inline-block; margin: auto; width: 13em; text-align: center; Background-color:#F0FFFF;{{Text color default}};">Licenses →</span>]]}}
{{BookCat}}
9v6ke5ycwakkdg9nnnxd1jr8rftx8dr
Chess Variants/Alice Chess
0
462599
4669639
4618410
2026-09-11T02:41:45Z
Sammy2012
3074780
En passant clarification
4669639
wikitext
text/x-wiki
{{alice chess diagram
| floatright
|
|rd|nd|bd|qd|kd|bd|nd|rd
|pd|pd|pd|pd|pd|pd|pd|pd
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|pl|pl|pl|pl|pl|pl|pl|pl
|rl|nl|bl|ql|kl|bl|nl|rl
<!-- Board A -->
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
<!-- Board B -->
| Starting position of Alice chess
}}
== Introduction ==
'''Alice chess''' is a variant where pieces teleport between two boards.
== History ==
Alice chess was created by prolific chess variant creator V. R. Parton in 1953. The variant is inspired by the Lewis Carroll book ''Through the Looking-Glass'', the sequel to ''Alice's Adventures in Wonderland'', and is named after the series' titular protagonist. The book involves Alice stepping through a looking-glass and entering a fantastical world, which was the inspiration for the variant's main mechanic.
The variant was one of the top 20 played variants in the chess variant correspondence organisation Knights of the Square Table (NOST), and in his Encyclopedia of Chess Variants, David Pritchard recommends it as one of the best chess variants in existence.
== Rules ==
{{alice chess diagram
| floatright
|
|rd|nd|bd|qd|kd| |nd|rd
|pd|pd|pd|pd| |pd|pd|pd
| | | | | | | |
| | | | |nl| | |
| | | | | | | |
| | | | | | | |
|pl|pl|pl|pl|pl|pl|pl|pl
|rl|nl|bl|ql|kl|bl| |rl
<!-- Board A -->
| | | | | | | |
| | | | | | | |
| | | | |pd| | |
| | |bd| | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
<!-- Board B -->
| Position after 1.Nf3 e6 2.Ne5 Bc5
}}
As already stated Alice chess is played with two boards, designated with the letters A and B, laid next to each other at game start. All of the pieces begin the game on board A.
On each turn, a player may choose to move a piece on either board A or B. The piece all retain their typical moves, but once a piece completes its move, it goes "through the looking-glass" and is transferred to the corresponding square on the opposite board. So for example, if a white knight moved from f1 to g3 on board A, the knight would then be transferred to the g3 square on board B.
There are three basic stipulations concerning each move:
* The move must be legal on the board where it is played.
* The corresponding square on the opposite board cannot be occupied by another piece, friendly or hostile.
* The king must not be in check at the end of the move.
Captures may only be played on the same board that the piece is moving on, since the transfer happens after the piece's move is complete.
When moving on one board a piece is allowed to pass over squares that are occupied by pieces on the other board. For example, in the diagram at left, after White moved Black would be allowed to play 3... Bg1, despite there being a white pawn on f2 on board A, since the move is legal on board B and g1 on square A is unoccupied.
The king is not allowed to make a move on one board, if its transfer to the other board would land it in check. It is also not allowed to use the transfer to escape check - it must move out of check before the transfer. Additionally, a player may not make a capture if their piece's transfer would expose their king to check.
A player is allowed to escape check by moving a piece on the other board so that its transfer blocks the check.
Castling is permitted as in standard chess, with both the king and rook teleporting to the other board.
''En passant'' is allowed provided both pawns are on the same board. The looking-glass mechanic may result in a situation where the square the capturing pawn would move to is occupied by another piece. If this piece is friendly, the ''en passant'' capture cannot happen. If the piece is hostile, the capturing pawn may capture it but no ''en passant'' capture will happen and the enemy pawn will remain on the board.
== Sub-variants ==
{{chess diagram small
| tright
|
|=
8 |rd|qd|kd|rd| | | | |=
7 |nd|bd|bd|nd| | | | |=
6 |pd|pd|pd|pd| | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 |pl|pl|pl|pl| | | | |=
2 |nl|bl|bl|nl| | | | |=
1 |rl|ql|kl|rl| | | | |=
a b c d e f g h
| Starting position of 4 by 8 Alice chess.
}}
* '''4 by 8 Alice chess''' is a smaller version of Alice chess proposed by Parton, played on two halves of a standard 8 by 8 board. The left half of the board acts as board A and the right half as board B.
* In '''Looking-glass Alice chess''', the white pieces start on board A as usual, but the black pieces start on board B.
* '''Ms. Alice chess''' allows a player to make a null move, which simply teleports a piece to the other board without moving it.
* In '''O'Donohue chess''' you are allowed to move a piece to a square occupied on the other board - in whcih case the teleport portion of the move is skipped.
* As its name suggests, '''Three-board Alice chess''' uses three boards instead of two. You are allowed to selected which board your piece teleports to.
{{BookCat}}
fcy2mqa9v44oihgrcykcg06lef3wgmh
Open Scholarship Press
0
464644
4669628
4652316
2026-09-10T21:54:24Z
LodestarChariot2
3138880
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/TenshiBot|TenshiBot]] ([[User talk:TenshiBot|talk]]) to last version by LodestarChariot2
4634851
wikitext
text/x-wiki
__NOTOC__{{DISPLAYTITLE:<span style="display:block;text-align:left;font-size:150%;font-style:italic;line-height:1em;">Open Scholarship Press </span>}}
[[File:Open Scholarship Press Logo.png|frameless|500px|none]]
''The Open Scholarship Press makes relevant open social scholarship research and output available openly to academics and non-academics alike.'' Its mandate is threefold:
* '''Curate and republish''' foundational, significant open access work in open social scholarship—and publish select important new and emergent work in the area—as objects of intervention aligned with stated goals of the Implementing New Knowledge Environments (INKE; https://inke.ca/) Partnership and its members and employing established and emergent methods pertinent to them.
* '''Publish open access''' journal issues related to work undertaken by Canadian Social Knowledge Institute (https://c-ski.ca/) entities, as objects of intervention and academic record aligned with shared open social scholarship goals.
* '''Provide a space''' for INKE Partnership researchers and partners to model collaborative, open scholarly practices that effectively meet the interests and needs of an engaged public for humanities and social sciences research in particular.
The Open Scholarship Press has published foundational research scans and curated volumes of reprinted, open access material on PubPub and Wikibooks. Further details are available [https://inke.ca/research-initiatives-output/open-scholarship-press/ here].
== [[Open Scholarship Press Collections]] ==
{{Helpful hint|title=PediaPress Versions |hint=PediaPress print versions of the texts are available for a fee: <br/><br/> [https://pediapress.com/books/show/fd0e233aec6a828d20e684abdf0193/ Community] <br /> [https://pediapress.com/books/show/027aafb529e385156b25c85a8d71e/ Connection] <br /> [https://pediapress.com/books/show/ba74969039f2e077d208a367e112c1/ Policy] <br /> [https://pediapress.com/books/show/763d613c60f578edc65268718af060/ Training]}}
The '''Open Scholarship Press Collections''' began by featuring four individual, book-length annotated bibliographies with analytical overviews covering key areas of open social scholarship: Community, Connection, Policy and Training. More recently, volumes on other key topics have been added.
{{Gallery
|File:OSP_Collections_Community_Cover_July2024.jpg|<center>'''[[Open Scholarship Press Collections: Community]]''' <br>''by Alyssa Arbuckle et al. (2023)''</center>
|File:OSP_Collections_Connection_Cover_May2024.jpg|<center>'''[[Open Scholarship Press Collections: Connection]]''' <br>''by Graham Jensen et al. (2023)''</center>
|File:OSP Collections Policy Cover Jan2024.jpg|<center>'''[[Open Scholarship Press Collections: Policy]]''' <br>''by Caroline Winter et al. (2023)''</center>
|File:OSP_Collections_Training_Cover_July2024.jpg|<center>'''[[Open Scholarship Press Collections: Training]]''' <br>''by Randa El Khatib et al. (2023)''</center>
|File:OSP-OSPO Volume 1 English cover.jpg|<center>'''[[Foundational Observations: Open Scholarship Policy Observatory, 2017-2020]]''' <br>''by Alyssa Arbuckle et al eds. (2025)''</center>
|File:OSP-OSPO Volume 2 English cover.jpg|<center>'''[[Extensions: Open Scholarship Policy Observatory, 2021-2024]]''' <br>''by Lynne Siemens et al eds. (2025)''</center>
|File:OSP-OSPO Volume 1 French cover.jpg|<center>'''[[b:fr:Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020|Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020]]''' <br>''by Alyssa Arbuckle et al eds. (2025)''</center>
|File:OSP-OSPO Volume 2 French cover.jpg|<center>'''[[b:fr:Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024|Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024]]''' <br>''by Lynne Siemens et al eds. (2025)''</center>
|File:OSP Knowledge Mobilization Scan cover.jpg|<center>'''[[Knowledge Mobilization in the Humanities]]''' <br>''by Caroline Winter et al eds. (2025)''</center>
|File:OSP Knowledge Diversity Scan cover.jpg|<center>'''[[Engaging Knowledge Diversity]]''' <br>''by Alan Colín-Arce et al eds. (2025)''</center>
|File:OSP Platforms Scan cover.jpg|<center>'''[[Engaging Platforms in Open Scholarship]]''' <br>''by Brittany Amell et al eds. (2025)''</center>
}}
== [[Open Scholarship Press Curated Volumes]] ==
{{Helpful hint|title=Other Versions |hint=Other versions of the texts are available from PubPub and, in print (for a fee), blurb: <br/><br/> Community: [https://openscholarshippress.pubpub.org/osp-curated-community PubPub] / [https://www.blurb.ca/bookstore/invited/10382733/21ae0c0a2df7161f08726f34d22f91b5dddd82ad blurb] <br /> Connection: [https://openscholarshippress.pubpub.org/osp-curated-connection PubPub] / [https://www.blurb.ca/bookstore/invited/10382732/0a55facf2f0064f78e1639e4b381579587e9fe19 blurb] <br /> Policy: [https://openscholarshippress.pubpub.org/osp-curated-policy PubPub] / [https://www.blurb.ca/bookstore/invited/10382910/178a90fb84761811c5ef79a3025ccf2e91f2a01d blurb] <br /> Training: [https://openscholarshippress.pubpub.org/osp-curated-training PubPub] / [https://www.blurb.ca/bookstore/invited/10382309/af6b2b48b2f0437383ccd75bff31c27f92e9335f blurb]}}
The '''Open Scholarship Press Curated Volumes''' feature four individual primers, book-length curated volumes of essential readings, following an analytical introduction, covering key areas of open social scholarship: Community, Connection, Policy and Training.
{{Gallery
|File:OSP_Collections_Community_Cover_July2024.jpg|<center>'''[[Open Scholarship Press Curated Volumes: Community]]''' <br>''by Alyssa Arbuckle et al. (2024)''</center>
|File:OSP_Collections_Connection_Cover_May2024.jpg|<center>'''[[Open Scholarship Press Curated Volumes: Connection]]''' <br>''by Graham Jensen et al. (2024)''</center>
|File:OSP Collections Policy Cover Jan2024.jpg|<center>'''[[Open Scholarship Press Curated Volumes: Policy]]''' <br>''by Caroline Winter et al. (2024)''</center>
|File:OSP_Collections_Training_Cover_July2024.jpg|<center>'''[[Open Scholarship Press Curated Volumes: Training]]''' <br>''by Randa El Khatib et al. (2024)''</center>
}}
== Other Publications Aligned With and Supporting OSP Volumes ==
These related publications have been part of the research and design process associated with these Open Scholarship Press volumes.
{{Gallery
|File:Folio_195r_-_The_Mass_of_Saint_Michael.jpg|'''[[Saint Michael: Early Anglo-Saxon Tradition]]''' (2022)
|File:HenryVIII 1509.jpg|'''[[The Lyrics of Henry VIII]]''' [https://press.uchicago.edu/ucp/books/book/distributed/L/bo38377003.html <br /> (also published as The Lyrics of the Henry VIII Manuscript)] (2018)
|File:Open_book_(Unsplash).jpg|'''[[Open Social Scholarship Annotated Bibliography]]''' [https://press.uchicago.edu/ucp/books/book/distributed/S/bo29121483.html <br /> (also published as An Annotated Bibliography of Social Knowledge Creation)] (2017)
|File:Hans Holbein the Younger - Unknown English Lady (Oskar Reinhart Collection).jpg|'''[[The Devonshire Manuscript|A Social Edition of the Devonshire MS (BL Add. MS 17492)]]''' <br /> [https://press.uchicago.edu/ucp/books/book/distributed/S/bo24757982.html (also published as A Social Edition of the Devonshire Manuscript (BL MS Add 17,492))] (2015)
}}
{{shelves|Humanities}}
{{One-page book}}
ajbnjyf6u1wymwt7vewa8d7huslpblu
Math for Non-Geeks
0
470009
4669578
4669490
2026-09-10T12:54:14Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-48940-54|~2026-48940-54]] ([[User talk:~2026-48940-54|talk]]) to last version by Sascha Lill 95
4664117
wikitext
text/x-wiki
{{Shelves|Applied mathematics|University level mathematics books}}{{status|50%}}{{Under construction}}
[[File:Titelbild MFNF mit Serlo-Logo.jpg|thumb|Title image of the German version by [[commons:User:Olivier Vidal|Olivier Vidal]] |center]]
= Books =
<div style="column-width: 50em;">
{{#invoke:Math for Non-Geeks/Seite|buecher}}
</div>
= Important note =
This book is a translated version of the book project [https://de.wikibooks.org/wiki/Mathe_f%C3%BCr_Nicht-Freaks “Mathe für Nicht-Freaks”] on the German version of Wikibooks. Templates and modules do not yet work completely and are in the process of being adjusted.
= Table of Contents =
This page lists all chapters of the project “Math for Non-Geeks”. This page serves as an overview and the complete navigation and the tables of contents of the individual books are generated from it.
{| class="wikitable"
|+Legend
!Symbol
!Meaning
|-
|red link
|Link to a chapter that does not yet exist and has yet to be written.
|-
|blue link
|Chapter has already been created and contains content.
|-
|{{stage|0%}}
|Progress 0% – Chapter has little or no content. The chapter must be rewritten or supplemented and revised.
|-
|{{stage|25%}}
|Progress 25% – Chapter is currently under development, but still needs to be significantly expanded.
|-
|{{stage|50%}}
|Progress 50% – Essential content is available, but important content still needs to be added (there are often ToDo notes on the page that still need to be added).
|-
|{{stage|75%}}
|Progress 75% – Chapter is finished in terms of content, but still needs to be revised (correct spelling mistakes, change wording so that it is easier to understand or sounds better. Remove redundant expressions).
|-
|{{stage|100%}}
|Progress 100% – The chapter is complete and has been proofread at least once. But you can also proofread again. In other words: correct spelling mistakes and improve the wording. These chapters (like all others) can also be supplemented content-wise.
|}
== Real Analysis ==
=== Help ===
* [[Math for Non-Geeks/Translating chapters|Translating chapters]]
* [[Math for Non-Geeks/Guidelines for translation|Guidelines for translation]]
* [[Math for Non-Geeks/Sitemap|Sitemap]]
=== Introduction ===
* [[Math for Non-Geeks/What is analysis?|What is analysis?]] {{stage|50%}}
* [[Math for Non-Geeks/Why studying analysis?|Why studying analysis?]] {{stage|50%}}
* [[Math for Non-Geeks/Propositional logic|Propositional logic]] {{stage|50%}}
* [[Math for Non-Geeks/Mathematical induction|Mathematical induction]] {{stage|50%}}
* [[Math for Non-Geeks/Real numbers|Real numbers]] {{stage|50%}}
=== Complex numbers ===
* [[Math for Non-Geeks/Introduction and motivation|Introduction and motivation]] {{stage|50%}}
* [[Math for Non-Geeks/Definition of complex numbers|Definition of complex numbers]] {{stage|50%}}
* [[Math for Non-Geeks/Absolute value and conjugation|Absolute value and conjugation]] {{stage|50%}}
* [[Math for Non-Geeks/Polar representation|Polar representation]] {{stage|0%}}
* [[Math for Non-Geeks/Drawing complex-valued functions|Drawing complex-valued functions]] {{stage|0%}}
* [[Math for Non-Geeks/Exercises: Complex numbers|Exercises]] {{stage|50%}}
=== Suprema and infima ===
* [[Math for Non-Geeks/Supremum and infimum|Supremum and infimum]] {{stage|50%}}
* [[Math for Non-Geeks/The infinite case|The infinite case]] {{stage|50%}}
* [[Math for Non-Geeks/How to prove existence of a supremum or infimum|How to prove existence of a supremum or infimum]] {{stage|50%}}
* [[Math for Non-Geeks/Properties of supremum and infimum|Properties of supremum and infimum]] {{stage|50%}}
=== Sequences ===
* [[Math for Non-Geeks/Sequences|Sequences]] {{stage|50%}}
* [[Math for Non-Geeks/Explicit and recursive description|Explicit and recursive description]] {{stage|50%}}
* [[Math for Non-Geeks/Examples and properties of sequences|Examples and properties of sequences]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Sequences|Exercises]] {{stage|50%}}
=== Convergence and divergence ===
* [[Math for Non-Geeks/Limit: Convergence and divergence|Limit: Convergence and divergence]] {{stage|50%}}
* [[Math for Non-Geeks/How to prove convergence and divergence|How to prove convergence and divergence]] {{stage|50%}}
* [[Math for Non-Geeks/Examples for limits|Examples for limits]] {{stage|50%}}
* [[Math for Non-Geeks/Unbounded sequences diverge|Unbounded sequences diverge]] {{stage|50%}}
* [[Math for Non-Geeks/Limit theorems|Limit theorems]] {{stage|50%}}
* [[Math for Non-Geeks/The squeeze theorem|The squeeze theorem]] {{stage|50%}}
* [[Math for Non-Geeks/Monotonicity criterion|Monotonicity criterion]] {{stage|50%}}
* [[Math for Non-Geeks/How to prove convergence for recursive sequences|How to prove convergence for recursive sequences]] {{stage|50%}}
* [[Math for Non-Geeks/Exercises: Convergence and divergence|Exercises]] {{stage|50%}}
=== Subsequences, Accumulation points and Cauchy sequences ===
* [[Math for Non-Geeks/Subsequences|Subsequences]] {{stage|50%}}
* [[Math for Non-Geeks/Accumulation points of sequences|Accumulation points of sequences]] {{stage|50%}}
* [[Math for Non-Geeks/Accumulation points of sets|Accumulation points of sets]] {{stage|50%}}
* [[Math for Non-Geeks/The Bolzano-Weierstrass theorem|The Bolzano-Weierstrass theorem]] {{stage|50%}}
* [[Math for Non-Geeks/Divergence to infinity|Divergence to infinity]] {{stage|50%}}
* [[Math for Non-Geeks/Divergence to infinity/Rules|Divergence to infinity: Rules]] {{stage|50%}}
* [[Math for Non-Geeks/Superior and inferior limit|Superior and inferior limit]] {{stage|50%}}
* [[Math for Non-Geeks/Cauchy sequences|Cauchy sequences]] {{stage|50%}}
* [[Math for Non-Geeks/Exercises: Subsequences, Accumulation points, and Cauchy sequences|Exercises]] {{stage|50%}}
=== Series ===
* [[Math for Non-Geeks/Series|Series]] {{stage|50%}}
* [[Math for Non-Geeks/Computation rules for series|Computation rules for series]] {{stage|50%}}
* [[Math for Non-Geeks/Telescoping sums and series|Telescoping sums and series]] {{stage|50%}}
* [[Math for Non-Geeks/Geometric series|Geometric series]] {{stage|50%}}
* [[Math for Non-Geeks/Harmonic series|Harmonic series]] {{stage|50%}}
* [[Math for Non-Geeks/Exponential series|Exponential series]] {{stage|50%}}
* [[Math for Non-Geeks/Absolute convergence of a series|Absolute convergence of a series]] {{stage|50%}}
* [[Math for Non-Geeks/Rearrangement theorem for series|Rearrangement theorem for series]] {{stage|50%}}
* [[Math for Non-Geeks/Exercises: Series|Exercises]] {{stage|50%}}
=== Convergence criteria for series ===
* [[Math for Non-Geeks/Overview: Convergence criteria|Overview: Convergence criteria]] {{stage|50%}}
* [[Math for Non-Geeks/Cauchy criterion|Cauchy criterion]] {{stage|50%}}
* [[Math for Non-Geeks/Term test|Term test]] {{stage|50%}}
* [[Math for Non-Geeks/Bounded series and convergence|Bounded series and convergence]] {{stage|50%}}
* [[Math for Non-Geeks/ Direct comparison test|Direct comparison test]] {{stage|50%}}
* [[Math for Non-Geeks/ Root test|Root test]] {{stage|50%}}
* [[Math for Non-Geeks/ Ratio test|Ratio test]] {{stage|50%}}
* [[Math for Non-Geeks/ Alternating series test|Alternating series test]] {{stage|50%}}
* [[Math for Non-Geeks/ Cauchy condensation test|Cauchy condensation test]] {{stage|50%}}
* [[Math for Non-Geeks/ Application of convergence criteria|Application of convergence criteria]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Convergence criteria for series|Exercises]] {{stage|50%}}
=== Exponential and Logarithm functions ===
* [[Math for Non-Geeks/ Derivation and definition of the exponential series|Derivation and definition of the exponential series]] {{stage|0%}}
* [[Math for Non-Geeks/ Properties of the exponential series|Properties of the exponential series]] {{stage|0%}}
* [[Math for Non-Geeks/ Logarithmic function|Logarithmic function]] {{stage|0%}}
* [[Math for Non-Geeks/ Real exponents|Real exponents]] {{stage|0%}}
* [[Math for Non-Geeks/ Exp and log functions for complex numbers|Exp and log functions for complex numbers]] {{stage|0%}}
* [[Math for Non-Geeks/ Exercises: Exponential and Logarithm functions|Exercises]] {{stage|50%}}
=== Trigonometric and Hyperbolic functions ===
* [[Math for Non-Geeks/ Sine and cosine|Sine and cosine]] {{stage|50%}}
=== Continuity ===
* [[Math for Non-Geeks/ Continuity of functions|Continuity of functions]] {{stage|50%}}
* [[Math for Non-Geeks/ Epsilon-delta definition of continuity|Epsilon-delta definition of continuity]] {{stage|50%}}
* [[Math for Non-Geeks/ Sequential definition of continuity|Sequential definition of continuity]] {{stage|50%}}
* [[Math for Non-Geeks/ Limit of functions|Limit of functions]] {{stage|25%}}
* [[Math for Non-Geeks/ Proving continuity|Proving continuity]] {{stage|50%}}
* [[Math for Non-Geeks/ Proving discontinuity|Proving discontinuity]] {{stage|50%}}
* [[Math for Non-Geeks/ Composition of continuous functions|Composition of continuous functions]] {{stage|50%}}
* [[Math for Non-Geeks/ Extreme value theorem|Extreme value theorem]] {{stage|50%}}
* [[Math for Non-Geeks/ Intermediate value theorem|Intermediate value theorem]] {{stage|50%}}
* [[Math for Non-Geeks/ Continuity of the inverse function|Continuity of the inverse function]] {{stage|50%}}
* [[Math for Non-Geeks/ Uniform continuity|Uniform continuity]] {{stage|50%}}
* [[Math for Non-Geeks/ Lipschitz continuity|Lipschitz continuity]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Continuity|Exercises]] {{stage|50%}}
=== Differential Calculus ===
* [[Math for Non-Geeks/ Derivatives|Derivatives]] {{stage|50%}}
* [[Math for Non-Geeks/ Computing derivatives|Computing derivatives]] {{stage|50%}}
* [[Math for Non-Geeks/ Computing derivatives - special|Computing derivatives - special]] {{stage|50%}}
* [[Math for Non-Geeks/ Derivative - inverse function|Derivative - inverse function]] {{stage|50%}}
* [[Math for Non-Geeks/ Examples for derivatives|Examples for derivatives]] {{stage|50%}}
* [[Math for Non-Geeks/ Derivatives of higher order|Derivatives of higher order]] {{stage|50%}}
* [[Math for Non-Geeks/ Rolle's theorem|Rolle's theorem]] {{stage|50%}}
* [[Math for Non-Geeks/ Mean value theorem|Mean value theorem]] {{stage|50%}}
* [[Math for Non-Geeks/ Constant functions|Constant functions]] {{stage|50%}}
* [[Math for Non-Geeks/ Monotonic functions|Monotonic functions]] {{stage|50%}}
* [[Math for Non-Geeks/ Derivative and local extrema|Derivative and local extrema]] {{stage|50%}}
* [[Math for Non-Geeks/ L'Hôspital's rule|L'Hôspital's rule]] {{stage|50%}}
* [[Math for Non-Geeks/ Overview: continuity and differentiability|Overview: continuity and differentiability]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Derivatives 1|Exercises 1]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Derivatives 2|Exercises 2]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Derivatives 3|Exercises 3]] {{stage|50%}}
* [[Math for Non-Geeks/ Exercises: Derivatives 4|Exercises 4]] {{stage|50%}}
== [[Math for Non-Geeks/Linear algebra|Linear algebra]] ==
=== Vector spaces ===
* [[Math for Non-Geeks/Introduction: Vector space|Introduction: Vector space]] {{stage|50%}}
* [[Math for Non-Geeks/Vector space|Vector space]] {{stage|50%}}
* [[Math for Non-Geeks/Vector space: properties|Vector space: properties]] {{stage|50%}}
* [[Math for Non-Geeks/Proofs for vector spaces|Proofs for vector spaces]] {{stage|50%}}
* [[Math for Non-Geeks/Field as a vector space|Field as a vector space]] {{stage|50%}}
* [[Math for Non-Geeks/Coordinate spaces|Coordinate spaces]] {{stage|50%}}
* [[Math for Non-Geeks/Sequence spaces|Sequence spaces]] {{stage|50%}}
* [[Math for Non-Geeks/Function spaces|Function spaces]] {{stage|50%}}
* [[Math for Non-Geeks/Subspace|Subspace]] {{stage|50%}}
* [[Math for Non-Geeks/Union and intersection of vector spaces|Union and intersection of vector spaces]] {{stage|50%}}
* [[Math for Non-Geeks/Sum of subspaces|Sum of subspaces]] {{stage|50%}}
* [[Math for Non-Geeks/Inner direct sum|Inner direct sum]] {{stage|50%}}
* [[Math for Non-Geeks/Complements of vector spaces|Complements of vector spaces]] {{stage|50%}}
* [[Math for Non-Geeks/Cosets of a subspace|Cosets of a subspace]] {{stage|50%}}
* [[Math for Non-Geeks/Quotient space|Quotient space]] {{stage|50%}}
=== Linear combinations, generators and bases ===
* [[Math for Non-Geeks/Linear combinations|Linear combinations]] {{stage|50%}}
* [[Math for Non-Geeks/Span|Span]] {{stage|50%}}
* [[Math for Non-Geeks/Generators|Generators]] {{stage|50%}}
* [[Math for Non-Geeks/Linear independence|Linear independence]] {{stage|50%}}
* [[Math for Non-Geeks/Basis|Basis]] {{stage|50%}}
* [[Math for Non-Geeks/Steinitz's theorem|Steinitz's theorem]] {{stage|50%}}
* [[Math for Non-Geeks/Dimension|Dimension]] {{stage|50%}}
=== Linear maps ===
* [[Math for Non-Geeks/Linear map|Linear map]] {{stage|50%}}
* [[Math for Non-Geeks/Properties of linear maps|Properties of linear maps]] {{stage|50%}}
* [[Math for Non-Geeks/Linear continuation|Linear continuation]] {{stage|50%}}
* [[Math for Non-Geeks/Proofs for linear maps|Proofs for linear maps]] {{stage|50%}}
* [[Math for Non-Geeks/Monomorphisms|Monomorphisms]] {{stage|50%}}
* [[Math for Non-Geeks/Epimorphisms|Epimorphisms]] {{stage|50%}}
* [[Math for Non-Geeks/Isomorphisms|Isomorphisms]] {{stage|50%}}
* [[Math for Non-Geeks/Endomorphism and Automorphism|Endomorphism and Automorphism]] {{stage|50%}}
* [[Math for Non-Geeks/Image of a linear map|Image of a linear map]] {{stage|50%}}
* [[Math for Non-Geeks/Kernel of a linear map|Kernel of a linear map]] {{stage|50%}}
* [[Math for Non-Geeks/Vector space of a linear map|Vector space of a linear map]] {{stage|50%}}
* [[Math for Non-Geeks/Dual space|Dual space]] {{stage|50%}}
* [[Math for Non-Geeks/Exercises Linear Maps|Exercises]] {{stage|50%}}
=== Matrices ===
* [[Math for Non-Geeks/Introduction: Matrices|Introduction: Matrices]] {{stage|50%}}
* [[Math for Non-Geeks/Matrix of a linear map|Matrix of a linear map]] {{stage|50%}}
* [[Math for Non-Geeks/Definition of a matrix|Definition of a matrix]] {{stage|50%}}
* [[Math for Non-Geeks/Linear systems and matrices|Linear systems and matrices]] {{stage|50%}}
* [[Math for Non-Geeks/Vector space structure on matrices|Vector space structure on matrices]] {{stage|50%}}
* [[Math for Non-Geeks/Matrix multiplication|Matrix multiplication]] {{stage|50%}}
* [[Math for Non-Geeks/Basis change via matrices|Basis change via matrices]] {{stage|50%}}
* [[Math for Non-Geeks/Exercises: Matrices|Exercises]] {{stage|50%}}
== [[Math for Non-Geeks/Measure theory|Measure theory]] ==
=== Introduction, basic definitions ===
* [[Math for Non-Geeks/Overview: Objects in Measure Theory|Overview: Objects in Measure Theory]] {{stage|50%}}
* [[Math for Non-Geeks/Volumes on rings|Volumes on rings]] {{stage|50%}}
* [[Math for Non-Geeks/Continuity of volumes on rings|Continuity of volumes on rings]] {{stage|50%}}
* [[Math for Non-Geeks/Pre-measures and measures|Pre-measures and measures]] {{stage|50%}}
=== Constructing measures ===
* [[Math for Non-Geeks/Constructing measures: overview|Constructing measures: overview]] {{stage|50%}}
* [[Math for Non-Geeks/Generated sigma-algebras|Generated sigma-algebras]] {{stage|50%}}
* [[Math for Non-Geeks/Existence of a measure continuation|Existence of a measure continuation]] {{stage|50%}}
* [[Math for Non-Geeks/Uniqueness of a continuation|Uniqueness of a continuation]] {{stage|50%}}
__NOINDEX__
__NONEWSECTIONLINK__
jklltezl69vko37nimqzf71lq79w4dn
Math for Non-Geeks/Linear algebra
0
470012
4669634
4669191
2026-09-11T01:00:45Z
JackBot
396820
Formatting, [[Special:UncategorizedPages]]
4669634
wikitext
text/x-wiki
{{#invoke:Math for Non-Geeks/Seite|oben}}
{{#invoke:Math for Non-Geeks/Seite|unten}}
{{BookCat}}
7qnyfhnvw9nj4qs9zuvu25464ttz0iu
Math for Non-Geeks/Measure theory
0
470013
4669636
4669190
2026-09-11T01:00:48Z
JackBot
396820
Formatting, [[Special:UncategorizedPages]]
4669636
wikitext
text/x-wiki
{{#invoke:Math for Non-Geeks/Seite|oben|}}
{{#invoke:Math for Non-Geeks/Seite|unten}}
{{BookCat}}
9m4ehkvsiuxqdsl7ei6u5d0tectgj53
Math for Non-Geeks: Template:Footer
0
470282
4669637
4669200
2026-09-11T01:00:49Z
JackBot
396820
Formatting, [[Special:UncategorizedPages]]
4669637
wikitext
text/x-wiki
<onlyinclude><div id="serlo-footer" style="clear:both" class="noprint">
{{#if:{{{weblinks|}}}|<h2>Weblinks</h2>
<div>
{{{weblinks}}}
</div>
}}{{#if:{{{einzelnachweise|}}}|
<h2>{{#invoke:Serlo/Utils|lang|de=Einzelnachweise|en=References}}</h2>
<references/>
}}{{#if:{{{quellen|}}}|
<h2>{{#invoke:Serlo/Utils|lang|de=Quellen|en=Sources}}</h2>
{{#invoke:Serlo/Utils|lang|de=Folgende Quellen wurden als Basis für diesen Artikel verwendet:|en=Following sources have been used as basis for this article:}}
<div>
{{{quellen}}}
</div>
}}{{#if:{{{next_link|}}}|
<!--{{Kasten
|style=grauer Kasten
|noprint=ja
|css=text-align: right; font-size: 90%;
|class=serlo-next-chapter
|inhalt= {{#invoke:Serlo/Utils|lang|de=[[{{{next_link}}}| {{{next_link_name}}}]] →|en=[[{{{next_link}}}| {{{next_link_name}}}]] →}}
}}-->
<div class="serlo-next-chapter" style="text-align: right; font-size: 90%;">
{{#invoke:Serlo/Utils|lang
|de=[[{{{next_link}}}| {{{next_link_name}}}]] →
|en=[[{{{next_link}}}| {{{next_link_name}}}]] →
}}
</div>
}}<div class="plainlinks" style="margin: 1.5em -1.5em 0 -1.5em; font-family: Open Sans,sans-serif;"><!--
Banner
-->
<!--{{#switch:{{{buch}}}
|Maßtheorie=
|Über das Projekt=
|Grundlagen der Mathematik=
|Real Analysis={{:Math for Non-Geeks/Template:Banner/Ausschreibung: Translating Real Analysis}}
|#default={{#invoke:TemplateUtils|random
|element1={{:Math for Non-Geeks/Template:Banner/Fertiges Buch Analysis 1}}
}}}}-->
<!--
Aufruf zur Mitarbeit
--><div style="background-color: #f8f9fa;{{Text default color}}; padding: 1.4rem;">
{{#invoke:Serlo/Utils|lang
<!--|de=
'''Fragen? Feedback? Interesse an der Mitarbeit?'''
Wenn du Fragen zum Inhalt hast oder etwas nicht verstanden hast, kontaktiere uns. Wir werden dir deine Fragen gerne beantworten! Auch für Kritik und Anmerkungen sind wir sehr dankbar! Unsere Artikel sind gewissenhaft recherchiert, aber vereinzelte Fehler können nicht ausgeschlossen werden und wir sind sehr dankbar für alle Hinweise. Melde dich auch bei uns, wenn du unsere Vision, Hochschulmathematik verständlich zu erklären, unterstützen möchtest! Unsere Kontaktmöglichkeiten:
{{-|[[File:Email social icon.svg|link=mailto:hochschulmathematik@serlo.org|x22px|alt=]] '''[mailto:hochschulmathematik@serlo.org E-Mail: hochschulmathematik@serlo.org]'''
[[File:Serlo Logo without wordmark.svg|link=https://community.serlo.org/channel/hochschulmathe|x22px|alt=]] '''[https://community.serlo.org/channel/hochschulmathe Channel #hochschulmathe des Serlo Community Chats]'''
[[File:Telegram alternative logo.svg|link=https://t.me/serlo_hochschule|x22px|alt=]] '''[https://t.me/serlo_hochschule Telegram-Gruppe: https://t.me/serlo_hochschule]'''}}
<small>Hinweis: Telegram ist ein externer Chatdienst, der nicht von Serlo oder der Wikimedia betrieben wird. Bitte informiere dich selbstständig, ob du mit ihren Datenschutzbestimmungen einverstanden bist.</small> -->
|de=
'''Feedback? Do you want to join?'''
If you have questions concerning the content, or didn't understand something, the feel free to contact us! We would love to answer your questions! Also we are thankful for critics and/or comments!
If you share our vision to explain university math in an comprehensible way, then contact us under:
[[File:Email social icon.svg|22px|link=mailto:en@serlo.org|alt=Email]] '''[mailto:en@serlo.org E-Mail: en@serlo.org]'''
[[File:Email social icon.svg|22px|link=mailto:en@serlo.org|alt=Email]] '''[mailto:hochschulmathematik@serlo.org E-Mail: hochschulmathematik@serlo.org]'''
<div margin-top: 1rem;></div>
}}
<div class="nomobile" style="display: flex; align-items: center; width: 192px; min-height: 5rem; float:left;">[[File:CC BY-SA icon.svg|150px|verweis=https://creativecommons.org/licenses/by-sa/3.0/deed.de|alt=CC-BY-SA 3.0]]</div>
<p style="padding-left: 3em; padding-right: 1em;">
{{#invoke:Serlo/Utils|lang
<!--|de=
Dieser Artikel steht unter einer freien [https://creativecommons.org/licenses/by-sa/3.0/deed.de CC-BY-SA 3.0] Lizenz. Damit kannst du ihn frei verwenden, bearbeiten und weiterverbreiten, solange du [[Math for Non-Geeks|„Math for Non-Geeks“]] als Quelle nennst und deine Änderungen am Text unter derselben [https://creativecommons.org/licenses/by-sa/3.0/deed.de CC-BY-SA 3.0] oder einer [https://creativecommons.org/compatiblelicenses dazu kompatiblen] Lizenz stellst. Auf der Seite [[Math for Non-Geeks/Kopiere uns|„Kopier uns!“]] erklären wir dir detailliert, was du bei der Benutzung unsere Texte, Bilder und Videos beachten musst.-->
|de=This article is licensed under the free license [https://creativecommons.org/licenses/by-sa/3.0/deed.de CC-BY-SA 3.0]. With that you can use it, modify it or share it freely, as long as you name [[Math for Non-Geeks|„Serlo“]] as source and put you changes under the same [https://creativecommons.org/licenses/by-sa/3.0/deed.de CC-BY-SA 3.0] oder an [https://creativecommons.org/compatiblelicenses compatible] license. On the page [[Math for Non-Geeks/Kopiere uns|„Kopier uns!“]] we explain you what you have to pay attention to, when using our texts, picture or videos.
}}
</p>
<div style="clear: both;"></div>
</div></div>
{{{kategorien|}}}</div></onlyinclude>
{{shelves}}
kwyyrvt9yqvhilqeku7n45nvk2v3mkj
Math for Non-Geeks/Dual space
0
473509
4669633
4635303
2026-09-11T01:00:44Z
JackBot
396820
Formatting, [[Special:UncategorizedPages]]
4669633
wikitext
text/x-wiki
{{#invoke:Math for Non-Geeks/Seite|oben}}
We have already seen the vector space of linear maps <math>\operatorname{Hom}_K(V,W)</math> between two <math>K</math>-vector spaces <math>V</math> and <math>W</math>. We will now consider the case where the vector space <math>W</math> corresponds to the field <math>K</math>.
==Motivation==
Consider the following example: We want to buy apples and pears. An apple costs $<math>2</math> and a pear $<math>3</math>. If <math>x\in\R</math> is the number of apples and <math>y\in\R</math> is the number of pears, how much do we have to pay in total? The formula for the total price is <math>2x+3y</math>. We can express this equation as <math>\R</math>-linear map
{{Math|<math>P\colon\R^2\to\R,(x,y)\mapsto 2x+3y</math>}}
Let's assume that the prices increase by half. To get the formula that gives the new total price, we need to multiply the old formula by <math>\frac{3}{2}</math>. The formula that gives this price would then be <math>\frac{3}{2}(2x+3y)=3x+\frac{9}{2}y</math>. The corresponding linear map is
{{Math|<math>Q\colon\R^2\to\R,(x,y)\mapsto 3x+\frac{9}{2}y.</math>}}
We thus recognize that <math>Q(x,y)=\frac{3}{2}P(x,y)</math>.
Suppose now that the price of apples increases by $<math>2</math> and the price of pears by $<math>4</math>. We obtain the corresponding formula for the total price by adding <math>2x+4y</math> to the original formula, i.e. <math>(2x+3y)+(2x+4y)=4x+7y</math>. This can be understood as the addition of linear maps. We define <math>R,S\colon\R^2\to\R</math> by <math>R(x,y)= 2x+4y</math> and <math>S(x,y)= 4x+7y</math>. Then <math> (P + R)(x,y)= P(x,y)+ R(x,y)= S(x,y)</math> holds true. So in this example, we simply added linear maps from <math> \R^2 </math> to <math> \R </math> and multiplied them by scalars.
The total price is indicated by linear maps from <math>\R^2\to \R</math>. Such a map assigns a value, namely the price, to each vector. In other words, we can say that the mapping "measures" these vectors. This is why we call linear maps from <math>\R^2</math> to <math>\R</math> ''linear measurement functions''. We have seen above that sums and scalar multiples of such maps are again linear maps. In other words, linear combinations of linear maps are again linear maps. So also on the set of linear maps on <math>\R^2</math>, we can find a vector space structure.
What about other vector spaces? Let's look at the <math>\C</math>-vector space <math>\C[x]_{\leq n}</math> of complex polynomials of degree at most <math>n\in\N</math>. There are a number of simple measurement functions here. These can, for example, assign to a polynomial <math>p</math> its value at a point <math>a \in \C</math>:
{{Math|<math>\operatorname{eval}_a\colon\C[x]_{\leq n}\to\C,p\mapsto p(a).</math>}}
Alternatively, we can assign to a polynomial the value of its derivative at the point <math>a \in \C</math>:
{{Math|<math>D_a\colon\C[x]_{\leq n}\to\C,p\mapsto p'(a).</math>}}
Since the coefficients of polynomials are scalars, we can use them to define further measurement functions. For example, for <math>p=a_nx^n+\ldots+a_1x+a_0</math>, consider the mappings <math>f, g\colon\C[x]_{\leq n}\to\C</math> defined by <math>f(p) = a_n+\ldots+a_1</math> and <math>g(p)= a_0 </math>. Then <math>(f+g)(p)=f(p)+g(p)=a_n+\ldots+a_1+a_0=p(1)=:\operatorname{eval}_1(p)</math>. We can also see here that sums of measurement functions are again measurement functions.
In general, we can also consider the space of linear measurement functions <math>V\to K</math> over an arbitrary <math>K</math>-vector space <math>V</math>. We will see that, as in the previous examples, this is a vector space. This space is called the dual space of <math>V</math>.
==Definition==
{{:Math for Non-Geeks/Template:Definition
|titel=Dual space
|definition=Let <math>V</math> be a vector space over a field <math>K</math>.
Then the space of linear mappings <math>V^*:=\operatorname{Hom}_K(V,K)</math> between the <math>K</math>-vector spaces <math>V</math> and <math>K</math> is called the dual space of <math>V</math>.}}
The following theorem states that the dual space is a vector space.
{{:Math for Non-Geeks/Template:Satz
|titel=<math>V^*</math> is a vector space
|satz=Let <math>V</math> be a vector space over a field <math>K</math>. Then <math>V^*</math> with the two relations
{{Math|<math>\begin{align}
+\colon V^* \times V^* &\to V^*\\
(f,g)&\mapsto f+g, \text{ where } (f + g)(v) := f(v) + g(v) \text{ for all }v \in V,
\end{align}</math>}}
and
{{Math|<math>\begin{align}
\cdot \colon K \times V^* &\to V^* \\
(\lambda,f)&\mapsto\lambda\cdot f, \text{ where } (\lambda \cdot f)(v) := \lambda\cdot f(v) \text{ for all }v \in V,
\end{align}</math>}}
a <math>K</math>-vector space.
|beweis=
We know from the article on [[Math for Non-Geeks/Function spaces#Anchor:Definition des Funktionenraums|function spaces]] that for <math>K</math>-vector spaces <math>V</math> and <math>W</math>, the set of linear maps <math>\operatorname{Hom}_K(V,W)</math> is also a <math>K</math>-vector space. Since <math>K</math> itself is a (1-dimensionsl) <math>K</math>-vector space, we know that for every <math>K</math> vector space <math>V</math>, also <math>V^*=\operatorname{Hom}_K(V,K)</math> is a <math>K</math> vector space.
}}
==Examples of vectors in the dual space==
{{:Math for Non-Geeks/Template:Beispiel
|titel=Characterization of <math>(\R^2)^*</math>
|beispiel=
The dual space of <math>\R^2</math> is the vector space of all linear maps from <math>\R^2</math> to <math>\R</math>. Each such linear map <math>f\in(\R^2)^*</math> is given by multiplication with a (1x2) matrix, the [[Math for Non-Geeks/Introduction: Matrices|representing matrix]], and is therefore of the form
{{Math|<math>f\colon\R^2\to\R,\quad\begin{pmatrix}x\\y\end{pmatrix}\mapsto \begin{pmatrix}a&b\end{pmatrix}\begin{pmatrix}x\\y\end{pmatrix}=ax+by</math>}}
for certain <math>a,b\in\R</math>. Thus, the elements in the dual space of <math>\R^2</math> are described by linear equations of the form <math>f(x,y)=ax+by</math>.
More generally, an element of <math>(\R^n)^*</math> is represented by a (1xn) matrix <math>\begin{pmatrix}a_1&\ldots&a_n\end{pmatrix}</math> or a linear equation of the form <math>f(x_1,\ldots,x_n)=a_1x_1+\ldots+a_nx_n</math> with coefficients <math>a_i\in\R</math>.
}}
{{:Math for Non-Geeks/Template:Beispiel
|titel=Limit of convergent sequences
|beispiel=Let <math>c</math> be the space of convergent sequences <math>(x_n)_{n \in \N } \subseteq \R</math>. Because sums and scalar multiples of convergent sequences are convergent sequences again, <math>c</math> is a <math>\R</math> vector space. You can read a proof of the vector space properties [[Math for Non-Geeks/Sequence spaces#Anchor:UnterraumBeschrFolgen|here]].
We consider the mapping <math> f\colon c \to \R , (x_n)_{n \in \N } \mapsto \lim_ {n \to \infty} x_n </math>, which sends a sequence to its limit value. For example, <math>f((1)_{n\in\N})=\lim_{n\to\infty}1=1</math> or <math>f\left(\left(\tfrac 1n\right)_{n\in\N}\right)=\lim_{n\to\infty}(\tfrac 1n)=0</math>. From the [[Math_for_Non-Geeks/Limit_theorems|limit theorems]] we know that
{{Math|<math>\begin{align}
\lim_{n\rightarrow\infty} (a_n + b_n) &= \lim_{n\to\infty}a_n + \lim_{n\to\infty}b_n \text{ and }\\
\lim_{n\rightarrow\infty} \lambda \cdot a_n &= \lambda \cdot \lim_{n\to\infty}a_n
\end{align}</math>}}
applies to all convergent sequences <math>(a_n)_{n\in\N},(b_n)_{n\in\N}\in c</math> and scalars <math>\lambda\in\R</math>. It follows that <math>f</math> is a linear map and therefore <math>f\in c^*</math> holds.
}}
{{:Math for Non-Geeks/Template:Beispiel
|titel=Polynomial space and the evaluation mapping
|beispiel=Let <math>K</math> be a field.
We consider the polynomial ring <math>K[X]</math> as a <math>K</math>-vector space. For <math>\lambda \in K</math> we define the mapping
{{Math|<math>\begin{align}
\operatorname{eval}_\lambda \colon K[X] &\to K, \\
P &\mapsto P(\lambda),
\end{align}</math>}}
which evaluates a polynomial at the position <math>\lambda</math>. For example, we have <math>\operatorname{eval}_1(x^2-1)=1^2-1=0</math> and <math> \operatorname{eval}_0(x^2-1)=0^2-1=-1</math>.
By direct computation, e can verify that this mapping is <math>K</math>-linear, i.e. an element of <math>K[X]^*</math>:
For <math>P, Q \in K[X]</math> and <math>k \in K</math> we then have:
{{Math|<math>\begin{align}
\operatorname{eval}_\lambda(P + k \cdot Q) &= (P + k \cdot Q)(\lambda) \\
&= P(\lambda) + k \cdot Q(\lambda) \\
&= \operatorname{eval}_\lambda(P) + k \cdot \operatorname{eval}_\lambda(Q).
\end{align}</math>}}
}}
{{:Math for Non-Geeks/Template:Beispiel
|titel=Derivative
|beispiel=Let <math>C^1(\mathbb{R})</math> be the space of continuously differentiable functions <math>\mathbb{R} \to \mathbb{R}</math>. Let <math>x\in\R</math> be fixed and consider the mapping
{{Math|<math>\begin{align}
\partial_x \colon C^1(\mathbb{R}) &\to \mathbb{R}, \\
f &\mapsto f'(x)
\end{align}</math>}}
which sends a differentiable function to its derivative at the point <math>x</math>. For example, for <math>x=0</math>, the value of the mapping in <math>f(t)=t^2-1</math> is given by
{{Math|<math>\partial_0(f)=f'(0)=(2t)|_{t=0}=0.</math>}}
We verify by direct computation that the mapping <math>\partial_x</math> (for fixed <math>x\in\R</math>) is linear: For <math>f,g \in C^1(\mathbb{R})</math> and <math>\lambda \in \mathbb{R}</math> we have
{{Math|<math>\begin{align}
\partial_x(f+\lambda g) &= (f+\lambda g)'(x)\\
&= f'(x)+\lambda g'(x)\\
&= \partial_x(f) + \lambda \partial_x(g).
\end{align}</math>}}
This follows from the properties of the [[Math_for_Non-Geeks/Computing_derivatives#Anchor:TabelleAbleitungsregeln|derivative]]. So <math>\partial_x</math> is an element of <math>C^1(\mathbb{R})^*</math>.
}}
{{:Math for Non-Geeks/Template:Beispiel
|titel=Integral
|beispiel=Let <math>C^0([0,1])</math> be the space of continuous functions <math>[0,1] \to \mathbb{R}</math>. Consider the mapping
{{Math|<math>\begin{align}
I \colon C^0([0,1]) &\to \mathbb{R}, \\
f &\mapsto \int_0^1 f(x) dx
\end{align}</math>}}
which sends a continuous function on <math>[0,1]</math> to its integral over this interval. As an example, for <math>f(x)=x^2-1</math>,
{{Math|<math>I(f)=\int_0^1 x^2-1 dx=[\frac13 x^3-x]_{x=0}^1=(\frac13-1)-0=-\frac23.</math>}}
We verify by direct calculation that the mapping <math>I</math> is linear: For <math>f,g \in C^0([0,1])</math> and <math>\lambda \in \mathbb{R}</math> the following applies
{{Math|<math>\begin{align}
I(f+\lambda g) &= \int_0^1 f(x)+g(x) dx\\
&= \int_0^1 f(x) dx + \int_0^1 g(x) dx\\
&=I(f) + \lambda I(g).
\end{align}</math>}}
This follows from the properties of the [[Math_for_Non-Geeks/Properties of the Riemann integral#Anchor:RiemannintegralEigenschaften|integral]]. So <math>I</math> is an element of <math>C^0([0,1])^*</math>.
}}
== Dual Basis ==
We now know what the dual space <math>V^*</math> of a <math>K</math>-vector space <math>V</math> is: It consists of all linear maps from <math>V</math> to <math>K</math>. Intuitively, we can understand these maps as linear maps that measure vectors from <math>V</math>. This is why we sometimes call elements of the dual space <math>V^*</math> "(linear) measurement functions" in this article.
Motivated by this intuitive notion of "measurements", we ask ourselves: Is there a subset <math>M\subseteq V^*</math> of measurement functions that can be used to uniquely determine vectors? In other words, is there a subset <math>M</math> so that we can find a measurement function <math>f\in M</math> with <math>f(v)\neq f(w)</math> for every choice of vectors <math>v,w\in V</math> with <math>v\neq w</math>?
Let's first consider what this means using an example:
{{:Math for Non-Geeks/Template:Beispiel
|titel=Unique determination of vectors using measurement functions
|beispiel=
Let us consider <math>V=\R^2</math>. Then the dual space <math>V^*</math> is the vector space of all linear maps <math>\R^2\to\R</math>. Consider the linear maps <math>f, g, h\in V^*</math> with
{{Math|<math>f(x,y)=2x-y,\quad g(x,y)=\frac12 y-x, \quad h(x,y)=y.</math>}}
If <math>M=\{f\}</math>, we cannot use these functions to determine vectors uniquely: For <math>v=(1,1)</math> and <math>w=(0,-1)</math>, we have <math>v\neq w</math>, but <math>f(v)=2-1=1=0-(-1)=f(w)</math>.
Even with the measurement functions in <math>M'=\{f,g\}</math>, the vectors <math>(1,1)</math> and <math>(0,-1)</math> cannot be distinguished: We also have <math>g(1,1)=-\frac12=g(0,-1)</math>.
However, if we consider the subset of measurement functions <math>M''=\{f,h\}</math> instead, then vectors in <math>\R^2</math> are uniquely determined by the measurements in <math>M''</math>: Let <math>v=(x,y)</math> and <math>w=(x',y')</math> be any vectors with <math>v\neq w</math>. Assume that <math>f(v)=f(w)</math> and <math>h(v)=h(w)</math> apply. From <math>h(v)=h(w)</math> we obtain <math>y=y'</math>. Together with <math>2x-y=f(v)=f(w)=2x'-y'</math>, we would then also get <math>2x=2x'</math>, i.e. <math>x=x'</math>. This would mean that <math>v=w</math>, which is a contradiction to our assumption. Therefore, <math>f(v)\neq f(w)</math> or <math>h(v)\neq h(w)</math> (or both) applies. Hence, for each choice of different vectors in <math>v,w\in\R^2</math>, at least one of the two measurements in <math>M''</math> provides different values for <math>v</math> and <math>w</math>. Vectors are therefore uniquely determined by the measurements in <math>M''</math>.
}}
In summary, our question is: Does there exist a subset <math>M\subseteq V^*</math> such that <math>v,w\in V</math> applies to all vectors: If <math>f(v)=f(w)</math> applies to all measurements <math>f\in M</math>, then <math>v=w</math> must be true.
We will first try to answer this question in <math>K^n</math>.
=== Measurement functions for unique determination of vectors ===
A vector <math>v=(v_1, \ldots ,v_n)\in K^n</math> is uniquely determined by its entries <math>v_i</math>. If we select measurement functions from <math>(K^n)^*</math> in such a way that their values provide us with the entries of a vector, then we have ensured that a vector is already uniquely determined by these values. Let us therefore consider the following mappings for <math>i\in\{1,\ldots,n\}</math>
{{Math|<math>f_i\colon K^n\to K,\quad x=(x_1,\ldots ,x_n) \mapsto x_i.</math>}}
You can check that the maps <math>f_i</math> are linear. In addition, <math>f_i(v)=v_i</math> holds for every <math>i</math>. The map <math>f_i</math> therefore provides the <math>i</math>-th entry of vectors in <math>K^n</math>. A vector <math>v\in K^n</math> is already uniquely determined by the values of <math>f_i</math>: Suppose we have vectors <math>v=(v_1,\ldots ,v_n)</math> and <math>w=(w_1,\ldots ,w_n)</math> in <math>K^n</math> with equal function values among the <math>f_i</math>, i.e., with <math>f_i(v)=f_i(w)</math> for all <math>i</math>. Then <math>v_i=f_i(v)=f_i(w)=w_i</math> applies for all <math>i</math> and therefore <math>v=w</math>. Thus, if <math>v,w\in K^{n}</math> with <math>f_{i}(v)=f_{i}(w)</math> for all <math>i</math>, then <math>v = w</math> follows.
It is also intuitively clear that we cannot omit any of the measurement functions <math>f_i</math> in order to uniquely determine a vector by its measurement values. For example, if we omit <math>f_j</math>, <math>j\in\{1,\ldots,n\}</math>, then for
{{Math|<math>v=(0,\ldots,0)\quad\text{ and }\quad w=(0,\ldots,0,\underbrace{1}_{j\text{-th position}},0,\ldots,0)</math>}}
we may have <math>f_i(v)=0=f_i(w)</math> for all measurement functions with <math>i\neq j</math>, but nevertheless <math>v\neq w</math>. The measurement functions <math>f_i</math> with <math>i\neq j</math> therefore no longer uniquely determine a vector.
So the <math>f_i</math> with <math>i=1,\ldots n</math> form a set of measurement functions that uniquely determine vectors from <math>K^n</math>. Further, they are minimal because we cannot omit any of the functions.
Can we generalize this to a general vector space <math>V</math>? In <math>K^n</math> we have used the fact that a vector <math>v=(v_1,\ldots,v_n)\in K^n</math> is uniquely determined by its entries <math>v_i</math>. Now, the <math>v_i</math> are precisely the coordinates of <math>v</math> with respect to the standard basis <math>\{e_1,\ldots,e_n\}\subseteq K^n</math>:
{{Math|<math>v=v_1\cdot e_1+\ldots+v_n\cdot e_n.</math>}}
In a general vector space <math>V</math>, we do not have a standard basis. However, as soon as we have chosen any basis <math>B</math>, we can speak of the coordinates of a vector with respect to <math>B</math> in the same way as in <math>K^n</math>. Just as in <math>K^n</math> with the standard basis, in <math>V</math> with the selected basis <math>B</math>, a vector <math>v\in V</math> is uniquely determined by its coordinates with respect to <math>B</math>. As soon as we have chosen a basis, we can try to proceed in the same way as in <math>K^n</math>.
In the following, we assume that <math>V</math> is finite-dimensional, i.e. <math>\dim V=n<\infty</math>. Let <math>B=\{b_1,\ldots,b_n\}</math> be a basis of <math>V</math>. Then every vector <math>v\in V</math> is of the form
{{Math|<math>v=a_1\cdot b_1+\ldots+a_n\cdot b_n</math>}}
with uniquely determined coordinates <math>a_1,\ldots,a_n\in K</math>. Analogous to <math>K^n</math>, we now define the linear measurement functions for <math>i\in\{1,\ldots,n\}</math> in <math>V^*</math>
{{Math|<math>f_i\colon V\to K,\quad v=a_1\cdot b_1+\ldots+a_n\cdot b_n\mapsto a_i.</math>}}
One of the measurement functions <math>f_i</math> therefore determines the <math>i</math>-th coordinate of vectors with respect to the basis <math>B</math>. Thus,
{{Math|<math>v=f_1(v)\cdot b_1+f_2(v)\cdot b_2+\ldots+f_n(v)\cdot b_n.</math>}}
for every vector <math>v\in V</math>.
{{:Math for Non-Geeks/Template:Warnung|Note that the definition of <math>f_i</math> depends on the selected basis <math>B</math>.}}
Since vectors in <math>V</math> are already uniquely determined by their coordinates, they are also already uniquely determined by the values of <math>f_i</math>. In other words, for all <math>v,w\in V</math> we have
{{Math|<math>f_1(v)=f_1(w),\, f_2(v)=f_2(w),\, \ldots,\, f_n(v)=f_n(w)\implies \underbrace{\sum_{i=1}^nf_i(v)\cdot b_i}_{=v}=\underbrace{\sum_{i=1}^nf_i(w)\cdot b_i}_{=w}\implies v=w.</math>}}
For the same reason as with <math>K^n</math>, none of the <math>f_i</math> can be omitted: If the <math>j</math>-th measurement function <math>f_j</math>, <math>i\in\{1,\ldots,n\}</math>, is missing, then any two vectors for which only the <math>j</math>-th coordinate with respect to <math>B</math> differs, can no longer be distinguished.
{{:Math for Non-Geeks/Template:Frage
|frage=Which two vectors can you choose here?
|antwort=
We choose an example analogous to <math>K^n</math> and set
{{Math|<math>v=0\cdot b_1+\ldots + 0\cdot b_{j-1}+1\cdot b_j+0\cdot b_{j+1}+\ldots+0\cdot b_n=b_j</math>}}
and
{{Math|<math>w=0\cdot b_1+\ldots+0\cdot b_n=0_V.</math>}}
Then <math>f_i(v)=0_K=f_i(w)</math> holds for all <math>i\in\{1,\ldots,j-1,j+1,\ldots,n\}</math>, but nevertheless <math>v\neq w</math>. If the <math>j</math>-th measurement function is omitted, then vectors are no longer uniquely determined by the function values of <math>f_i</math>.
}}
=== The measurement functions form a basis ===
Let <math>V</math> be a vector space with a fixed basis <math>B=\{b_1,\ldots,b_n\}</math> and let the <math>f_i</math> be defined as above. If you want to determine vectors uniquely using the values of <math>f_i</math>, you cannot do without any of the <math>f_i</math>. The reason for this is that the result of a measurement <math>f_j(v)</math> (the <math>j</math>-th coordinate of <math>v</math> with respect to <math>B</math>) cannot be deduced from the other measurements. That means, we cannot represent any of the measurement functions <math>f_j</math> as a linear combination of the other <math>f_i</math> (<math>i\neq j</math>). In other words, the measurement functions <math>f_i</math> are linearly independent.
On the other hand, the values of <math>f_i</math> already tell us everything there is to know about a vector <math>v\in V</math>: Its coordinates with respect to the selected basis <math>B</math>. Can all other measurement functions from <math>V^*</math> therefore be combined from <math>f_1,\ldots,f_n</math>? Any measurement function <math>g\colon V\to K</math> from <math>V^*</math> is already uniquely determined by its values on the basis vectors <math>b_1,\ldots,b_n</math> according to the [[Math for Non-Geeks/Linear continuation#Satz:Satz von der linearen Fortsetzung|principle of linear continuation]]. For <math>i\in\{1,\ldots,n\}</math>, let <math>\lambda_i=g(b_i)\in K</math> be these values. Furthermore, <math>f_i(b_i)=1</math> and <math>f_i(b_j)=0</math> apply for <math>j\neq i</math> and all <math>i\in\{1,\ldots,n\}</math>. By inserting the <math>b_i</math> we obtain that
{{Math|<math>g=\lambda_1\cdot f_1+\ldots+\lambda_n\cdot f_n</math>}}
assume the same values on the basis vectors. According to the principle of linear continuation, the two linear maps are therefore identical. Thus, every <math>g\in V^*</math> can be written as a linear combination of <math>f_i</math>. In other word, the measurement functions <math>f_i</math> form a generating system of <math>V^*</math>.
Hence, <math>\{f_1,\ldots,f_n\}\subseteq V^*</math> is a basis of the dual space, and we can prove the following theorem:
{{:Math for Non-Geeks/Template:Satz
|titel=Existence of a dual basis
|satz=
Let <math>V</math> be a finite dimensional vector space and <math>B=\{b_1,\ldots,b_n\}</math> a basis of <math>V</math>. Then there exists a unique basis <math>B^*=\{f_1,\ldots,f_n\}</math> of <math>V^*</math> such that
{{Math|<math>f_i(b_j)=\begin{cases}1 & \text{if }i=j\\0&\text{else}\end{cases}</math>}}
is true for all <math>i,j\in\{1,\ldots,n\}</math>.
|beweis=
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=Existence and uniqueness of the <math>f_i</math>.
|beweisschritt=
According to the [[Math for Non-Geeks/Linear continuation#Satz:Satz von der linearen Fortsetzung|principle of linear continuation]], the linear maps <math>f_i</math> exist and are uniquely determined by their values on the basis vectors of <math>V</math>.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=The <math>f_i</math> are linearly independent.
|beweisschritt=
Let <math>\lambda_1,\ldots,\lambda_n\in K</math> with <math>\sum_{i=1}^n\lambda_if_i=0_{V^*}</math>. Let further <math>i\in\{1,\ldots,n\}</math>. Because <math>f_i(b_i)=1</math> and <math>f_j(b_i)=0</math> for <math>j\neq i</math>, we obtain the following by plugging in <math>b_i</math>:
{{Math|<math>0_K=0_{V^*}(b_i)=(\sum_{i=1}^n\lambda_if_i)(b_i)=\sum_{i=1}^n\lambda_if_i(b_i)=\lambda_i.</math>}}
Because <math>i\in\{1,\ldots,n\}</math> was arbitrary, we conclude <math>\lambda_1=\ldots=\lambda_n=0_K</math>.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=The <math>f_i</math> form a generating system.
|beweisschritt=
Let <math>f\in V^*</math> be arbitrary. For <math>i\in\{1,\ldots, n\}</math> we define <math>\lambda_i=f(b_i)\in K</math> and set <math>g=\sum_{i=1}^n\lambda_if_i</math>. Then, proceeding as in the proof of linear independence, we obtain
{{Math|<math>g(b_i)=(\sum_{i=1}^n\lambda_if_i)(b_i)=\sum_{i=1}^n\lambda_if_i(b_i)=\lambda_i</math>}}
for each <math>i\in\{1,\ldots,n\}</math>. Because <math>f(b_i)=g(b_i)</math> applies to all <math>i</math> and because a linear map is already uniquely determined by the images of its basis vectors, we have <math>f=g\in\operatorname{span}\{f_1,\ldots,f_n\}</math>. The <math>f_i</math> therefore form a generating system.
}}
}}
We call the uniquely determined basis <math>B^*</math> the '''dual basis''' with respect to <math>B</math> and denote its basis vectors by <math>b_i^*=f_i</math>.
{{:Math for Non-Geeks/Template:Definition
|titel=Dual basis
|definition=
Let <math>V</math> be a finite dimensional vector space with basis <math>B=\{b_1,\ldots,b_n\}</math>. The uniquely determined basis <math>B^*=\{b_1^*,\ldots,b_n^*\}</math> with
{{Math|<math>b_i^*(b_j)=\begin{cases}1 & \text{if }i=j\\0&\text{else}\end{cases}</math>}}
is called the dual basis of <math>B</math>.
}}
{{:Math for Non-Geeks/Template:Warnung| Note that <math>B^*</math> depends on the basis chosen for <math>V</math>. Furthermore, you cannot "dualize" individual vectors from <math>V</math>, but only entire bases.}}
=== What happens in the infinite dimension? ===
Above, we only considered the case <math>\dim V<\infty</math>. Can we proceed analogously if <math>V</math> is infinite dimensional? To define the measurement functions <math>f_i</math>, we must first choose a basis of <math>V</math>. Let <math>B=\{b_i\mid i\in I\}\subseteq V</math> be a basis of <math>V</math>, where <math>I</math> is an (infinite) index set. The principle of linear continuation also applies in infinite dimensions: For given values <math>\lambda_i\in K</math>, <math>i\in I</math>, there is exactly one linear map <math>f\colon V\to K</math> with <math>f(b_i)=\lambda_i</math> for all <math>i\in I</math>. Just as in the finite-dimensional case, we can therefore define the map <math>f_i\colon V\to K</math> for <math>i\in I</math> using the rule
{{Math|<math>f_i(b_j)=\begin{cases}1, & j=i\\ 0, & j\neq i\end{cases}.</math>}}
We can then show that <math>\{f_i\mid i\in I\}</math> is also a linearly independent subset of <math>V^*</math> in infinite dimensions. The proof is analogous to the proof of linear independence in the [[Math for Non-Geeks/Dual space#Satz:Existenz der dualen Basis|theorem on the dual basis]].
However, in infinitely many dimensions, <math>\{f_i\mid i\in I\}</math> cannot be a generating system of <math>V^*</math>: One can consider the function
{{Math|<math>h\colon V\to K,\quad b_i\mapsto 1\text{ for all }i\in I,</math>}}
which assumes the value 1 on all basis vectors. This function cannot be represented as a finite linear combination of <math>f_i</math>.
So in infinitely many dimensions, the "dual basis" <math>\{f_i\mid i\in I\}</math> is not a basis of the dual space.
==Exercises==
{{:Math for Non-Geeks/Template:Aufgabe
|titel=Determining dual basis vectors and their kernels
|aufgabe=
Let <math>V</math> be a finite-dimensional vector space and let <math>v\in V</math> with <math>v\neq0</math>. Show that there exists an <math>f\in V^*</math> with <math>f(v)\neq0</math>.
|erklärung=
When deriving the dual basis, we were guided by the idea that vectors in <math>V</math> should be distinguishable by "measurements" in <math>V^*</math>. In this exercise, we will convince ourselves that this is true: We can always find a measurement <math>f\in V^*</math> for which <math>f(0_V)=0</math> (this applies to every linear mapping), but <math>f(v)\neq0</math>. We may therefore find an element in the dual space with which we can distinguish <math>v</math> and the zero vector.
|lösungsweg=
We have to construct a linear map <math>f\colon V \to K</math>. This map is one element of <math>V^\ast</math>. According to the [[Math for Non-Geeks/Linear continuation#Anchor:lineare Fortsetzung|principle of linear continuation]], we can construct linear maps by specifying what they do on a basis.
To use this principle, it is convenient to have a basis of <math>V</math>. Even more convenient is to have a basis of <math>V</math> that contains <math>v</math> as a basis vector.
We can construct such a basis using the [[Math for Non-Geeks/Basis#Anchor:Basisergänzungssatz|basis completion theorem]], which tells us that <math>V</math> has a basis <math>b_1,\dots, b_n</math> with <math>b_1 = v</math>. Using the principle of linear continuation, we can thus construct a linear map that does not send <math>b_1 = v</math> to <math>0</math>. For example, we can choose that <math>f\colon V \to K</math>, which sends all <math>b_1</math> to <math>1</math> and <math>b_i</math> for <math>i = 2, \dots, n</math> to <math>0</math>.
This is exactly the dual basis vector <math>b_1^\ast</math> in the dual basis to <math>b_1, \dots, b_n</math>.
|lösung=
According to the [[Math for Non-Geeks/Basis#Anchor:Basisergänzungssatz|Basis completion theorem]], there exists a basis <math>B = \{b_1, \dots, b_n\}</math> with <math>b_1 = v</math>. From the [[#Definition:Duale Basis|definition of the dual basis]] we obtain that the dual basis vector <math>b_1^\ast</math> of <math>B^\ast</math> has the property <math>b_1^\ast(v) = b_1^\ast(b_1) = 1\ne 0</math>. Thus <math>f = b_1^\ast</math> fulfills the desired condition.
}}
{{:Math for Non-Geeks/Template:Gruppenaufgabe
|titel=Determining the dual basis
|aufgabe=
|teilaufgabe1= Consider the basis <math>B_1=\left\{\begin{pmatrix}2\\0\\1\end{pmatrix},\begin{pmatrix}0\\1\\1\end{pmatrix},\begin{pmatrix}1\\1\\2\end{pmatrix}\right\}</math> of <math>\R^3</math>. Determine the basis <math>B_1^*=\{v_1^*,v_2^*,v_3^*\}</math> which is dual to <math>B_1</math>, that is, for <math>1\leq i\leq3</math> determine the explicit form of the function
{{Math|<math>v_i^*\colon \R^3\to\R,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto v_i^*(\begin{pmatrix}x\\y\\z\end{pmatrix}).</math>}}
|teilaufgabe2= Consider the basis <math>B_2=\{t^3+t^2, t^2, t^2-t, 1\}</math> of <math>\R[t]_{\leq3}</math>. Determine the basis dual to <math>B_2</math> <math>B_2^*=\{p_1^*,\ldots,p_4^*\}</math>, i.e. for <math>1\leq i\leq 4</math> determine the explicit form of the function
{{Math|<math>p_i^*\colon \R[t]_{\leq3}\to\R,\quad a_3t^3+a_2t^2+a_1t+a_0\mapsto p_i^*(a_3t^3+a_2t^2+a_1t+a_0).</math>}}
|teilaufgabe3= Consider the basis <math>B_3=\left\{\begin{pmatrix}1&0\\0&0\end{pmatrix}, \begin{pmatrix}0&1\\1&0\end{pmatrix}, \begin{pmatrix}0&1\\-1&0\end{pmatrix}, \begin{pmatrix}1&1\\1&1\end{pmatrix}\right\}</math> of <math>\C^{2\times 2}</math>. Determine the basis <math>B_3^*=\{M_1^*,\ldots,M_4^*\}</math> dual to <math>B_3</math> , i.e. for <math>1\leq i\leq 4</math> determine the explicit form of the function
{{Math|<math>M_i^*\colon \C^{2\times 2}\to\C,\quad\begin{pmatrix}a&b\\c&d\end{pmatrix}\mapsto M_i^*(\begin{pmatrix}a&b\\c&d\end{pmatrix}).</math>}}
|teilaufgabe1-lösung=
Set <math>v_1=(2,0,1)^T</math>, <math>v_2=(0,1,1)^T</math> and <math>v_3=(1,1,2)^T</math>. We are looking for linear maps <math>v_1^*,v_2^*,v_3^*\colon \R^3\to\R</math> whose values we only know on the basis vectors <math>v_i</math>. We must define <math>v_i^*((x,y,z)^T)</math> for general <math>x,y,z\in\R</math>.
By definition of the dual basis, we already know the function values of each <math>v_i^*</math> on the basis vectors in <math>B_1</math>. Applying the [[Math for Non-Geeks/Linear continuation#Satz:Satz von der linearen Fortsetzung|principle of linear continuation]], we can determine all function value: Because <math>B_1</math> is a basis, there are coordinates <math>a, b,c\in\R</math> for each <math>(x,y,z)^T\in\R^3</math> such that <math>(x,y,z)^T=av_1+bv_2+cv_3</math>. With the help of linearity we get
{{Math|<math>v_i^*((x,y,z)^T)=v_i^*(av_1+bv_2+cv_3)=av_i^*(v_1)+bv_i^*(v_2)+cv_i^*(v_3).</math>}}
We know the values <math>v_i^*(v_j)</math> by definition of the dual basis. We therefore only need to determine the coordinates of any vector <math>(x,y,z)^T</math> with respect to <math>B_1</math>. Then we can write out the <math>v_i^*</math>.
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=Determining the coordinates of any vector <math>(x,y,z)^T</math> with respect to <math>B_1</math>
|beweisschritt=
We want to determine the coordinates with respect to <math>B_1</math> of any vector <math>(x,y,z)^T</math>. Let <math>x,y,z\in\R</math>. We write
{{Math|<math>\begin{pmatrix}x\\y\\z\end{pmatrix}=x\begin{pmatrix}1\\0\\0\end{pmatrix}+y\begin{pmatrix}0\\1\\0\end{pmatrix}+z\begin{pmatrix}0\\0\\1\end{pmatrix}=xe_1+ye_2+ze_3.</math>}}
The coordinates of <math>(x,y,z)^T</math> with respect to the standard basis <math>B_{st}=\{e_1,e_2,e_3\}</math> are therefore simply <math>x</math>, <math>y</math> and <math>z</math>. If we write <math>k_{B_{st}}</math> for the [[Math for Non-Geeks/Isomorphisms#Definition:Koordinatenabbildung|coordinate map]], this means
{{Math|<math>k_{B_{st}}(\begin{pmatrix}x\\y\\z\end{pmatrix})=\begin{pmatrix}x\\y\\z\end{pmatrix}.</math>}}
We can convert these into coordinates <math>a,b,c</math> with respect to <math>B_1</math> by multiplying the coordinate vector of <math>B_{st}</math> from the left by the [[Math for Non-Geeks/Basis change via matrices|basis transition matrix]] <math>T^{B_{st}}_{B_1}</math> that implements the transfer from <math>B_{st}</math> to <math>B_1</math>. Then
{{Math|<math>\begin{pmatrix}a\\b\\c\end{pmatrix}=T^{B_{st}}_{B_1}\begin{pmatrix}x\\y\\z\end{pmatrix}.</math>}}
In order to determine the basis transition matrix <math>T^{B_{st}}_{B_1}</math>, we calculate the coordinates of the standard basis vectors <math>e_1,e_2,e_3</math> with respect to <math>B_1</math>. These form the columns of <math>T^{B_{st}}_{B_1}</math>.
We start with <math>e_1</math>: We are looking for <math>a_1,b_1,c_1\in\R</math> such that
{{Math|<math>a_1v_1+b_1v_2+c_1v_3=a_1\begin{pmatrix}2\\0\\1\end{pmatrix}+b_1\begin{pmatrix}0\\1\\1\end{pmatrix}+c_1\begin{pmatrix}1\\1\\2\end{pmatrix}=\begin{pmatrix}1\\0\\0\end{pmatrix}</math>}}
For this we have to solve the linear system
{{Math|<math>\begin{align}
2a_1 + c_1&=1\\
b_1+c_1&=0\\
a_1+b_1+2c_1&=0
\end{align}</math>}}
which yields <math>a_1=1</math>, <math>b_1=1</math> and <math>c_1=-1</math>. In the same way, we determine the coordinates <math>a_2=1, b_2=3, c_2=-2</math> of <math>e_2</math> with respect to <math>B_1</math> and the coordinates <math>a_3=-1, b_3=-2, c_3=2</math> of <math>e_3</math> with respect to <math>B_1</math>. Then
{{Math|<math>T^{B_{st}}_{B_1}=\begin{pmatrix}
a_1&a_2&a_3\\
b_1&b_2&b_3\\
c_1&c_2&c_3
\end{pmatrix}=\begin{pmatrix}
1&1&-1\\
1&3&-2\\
-1&-2&2
\end{pmatrix}.</math>}}
Note: We could also have solved all three systems at once by summarizing the "right-hand sides" column by column, i.e. by taking the inverse of <math>\begin{pmatrix}
2&0&1\\
0&1&1\\
1&1&2
\end{pmatrix}</math>
. This makes sense, because this matrix is the basis transition matrix from <math>B_1</math> to the standard basis. Its inverse is therefore the matrix <math>T^{B_{st}}_{B_1}</math> that transitions from <math>B_{st}</math> to <math>B_1</math>.
The coordinates of <math>(x,y,z)^T</math> with respect to <math>B_1</math> are therefore
{{Math|<math>T_{B_1}^{B_{st}}k_{B_{st}}(\begin{pmatrix}x\\y\\z\end{pmatrix})=\begin{pmatrix}
1&1&-1\\
1&3&-2\\
-1&-2&2
\end{pmatrix}\begin{pmatrix}x\\y\\z\end{pmatrix}=\begin{pmatrix}
x+y-z\\
x+3y-2z\\
-x-2y+2z
\end{pmatrix}.</math>}}
Of course, it is also okay to guess the coordinates of <math>(x,y,z)^T</math> with respect to <math>B_1</math> by looking closely without solving systems of equations.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=Result for <math>v_1^*,v_2^*,v_3^*</math>
|beweisschritt=
We can now write any <math>(x,y,z)^T</math> as
{{Math|<math>\begin{pmatrix}x\\y\\z\end{pmatrix}=(x+y-z)v_1+(x+3y-2z)v_2+(-x-2y+2z)v_3.</math>}}
Using linearity of <math>v_i^*</math> and the definition of the dual basis, we obtain
{{Math|<math>v_1^*((x,y,z)^T)=(x+y-z)\underbrace{v_1^*(v_1)}_{=1}+(x+3y-2z)\underbrace{v_1^*(v_2)}_{=0}+(-x-2y+2z)\underbrace{v_1^*(v_3)}_{=0}=x+y-z.</math>}}
In the same way, we calculate <math>v_2^*((x,y,z)^T)=x+3y-2z</math> and <math>v_3^*((x,y,z)^T)=-x-2y+2z</math>. In total, we have therefore determined the three basis vectors of the dual basis:
{{Math|<math>\begin{align}
v_1^*&\colon\R^3\to\R^3,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto x+y-z,\\
v_2^*&\colon\R^3\to\R^3,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto x+3y-2z,\\
v_3^*&\colon\R^3\to\R^3,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto -x-2y+2z.
\end{align}</math>}}
}}
|teilaufgabe2-lösung=We know what the map <math>p_i^*</math> does with the basis vectors <math>p_i\in B_2</math>. To find out how <math>p_i^*</math> acts on a general vector <math>a_3t^3+a_2t^2+a_1t+a_0</math>, we can express it in the basis <math>B_2</math> via linear combination:
{{Math|<math>\begin{align}
& a_3t^3+a_2t^2+a_1t+a_0 \\
& {\color{OliveGreen}\left\downarrow \text{ expand with } a_3t^3-a_3t^3 \text{ and } -a_1t^2+a_1t^2 \right.}\\
= & a_3(t^3+t^2)-a_3t^2+a_2t^2+a_1(t-t^2)+a_1t^2+a_0 \\
& {\color{OliveGreen}\left\downarrow \text{sort by basis vectors }p_1,p_2,p_3,p_4 \right.}\\
=& a_3(t^3+t^2)+(a_1+a_2-a_3)t^2 -a_1(t^2-t)+a_0\\
=& a_3 p_4+(a_1+a_2-a_3)p_3-a_1 p_2+p_1
\end{align}</math>}}
This allows us to calculate the desired functions. For <math>p_1^*</math> we have
{{Math|<math>\begin{align}
& p_1^*(a_3t^3+a_2t^2+a_1t+a_0)\\
=&p_1^*(a_3 p_4+(a_1+a_2-a_3)p_3-a_1 p_2+p_1)\\
& {\color{OliveGreen}\left\downarrow p_1^* \text{ is linear.}\right.}\\
=& a_3\underbrace{p_1^*(p_4)}_{=0}+(a_1+a_2-a_3)\underbrace{p_1^*(p_3)}_{=0}-a_1\underbrace{p_1^*(p_2)}_{=0}+\underbrace{p_1^*(p_1)}_{=1}\\
=& 1
\end{align}</math>}}
For <math>p_2^*</math> we get
{{Math|<math>\begin{align}
& p_2^*(a_3t^3+a_2t^2+a_1t+a_0)\\
=&p_2^*(a_3 p_4+(a_1+a_2-a_3)p_3-a_1 p_2+p_1)\\
& {\color{OliveGreen}\left\downarrow p_2^* \text{ is linear.}\right.}\\
=& a_3\underbrace{p_2^*(p_4)}_{=0}+(a_1+a_2-a_3)\underbrace{p_2^*(p_3)}_{=0}-a_1\underbrace{p_2^*(p_2)}_{=1}+\underbrace{p_2^*(p_1)}_{=0}\\
=& -a_1
\end{align}</math>}}
So the function of <math>p_3^*</math> is
{{Math|<math>\begin{align}
& p_3^*(a_3t^3+a_2t^2+a_1t+a_0)\\
=&p_3^*(a_3 p_4+(a_1+a_2-a_3)p_3-a_1 p_2+p_1)\\
& {\color{OliveGreen}\left\downarrow p_3^* \text{ is linear.}\right.}\\
=& a_3\underbrace{p_3^*(p_4)}_{=0}+(a_1+a_2-a_3)\underbrace{p_3^*(p_3)}_{=1}-a_1\underbrace{p_3^*(p_2)}_{=0}+\underbrace{p_3^*(p_1)}_{=0}\\
=& a_1+a_2-a_3
\end{align}</math>}}
For <math>p_4^*</math> we get
{{Math|<math>\begin{align}
& p_4^*(a_3t^3+a_2t^2+a_1t+a_0)\\
=&p_4^*(a_3 p_4+(a_1+a_2-a_3)p_3-a_1 p_2+p_1)\\
& {\color{OliveGreen}\left\downarrow p_4^* \text{ is linear.}\right.}\\
=& a_3\underbrace{p_4^*(p_4)}_{=1}+(a_1+a_2-a_3)\underbrace{p_4^*(p_3)}_{=0}-a_1\underbrace{p_4^*(p_2)}_{=0}+\underbrace{p_4^*(p_1)}_{=0}\\
=& a_3
\end{align}</math>}}
In summary, we obtain the following functions
{{Math|<math>\begin{align}
&p_1^*\colon \R[t]_{\leq3}\to\R,\quad a_3t^3+a_2t^2+a_1t+a_0\mapsto 1\\
&p_2^*\colon \R[t]_{\leq3}\to\R,\quad a_3t^3+a_2t^2+a_1t+a_0\mapsto -a_1\\
&p_1^*\colon \R[t]_{\leq3}\to\R,\quad a_3t^3+a_2t^2+a_1t+a_0\mapsto a_1+a_2-a_3\\
&p_1^*\colon \R[t]_{\leq3}\to\R,\quad a_3t^3+a_2t^2+a_1t+a_0\mapsto a_3\\
\end{align}</math>}}
|teilaufgabe3-lösung=
We know the values of each <math>M_i^*</math> when applied to the basis vectors <math>M_1=\begin{pmatrix}1&0\\0&0\end{pmatrix}, M_2=\begin{pmatrix}0&1\\1&0\end{pmatrix}, M_3=\begin{pmatrix}0&1\\-1&0\end{pmatrix}, M_4=\begin{pmatrix}1&1\\1&1\end{pmatrix}</math> and want to find the value for any matrix <math>A=\begin{pmatrix}a&b\\c&d\end{pmatrix}</math>. To do this, we express <math>A</math> as a linear combination of <math>M_i</math>:
{{Math|<math>\begin{align}
\begin{pmatrix}a&b\\c&d\end{pmatrix}&=a\begin{pmatrix}1&0\\0&0\end{pmatrix}+b\begin{pmatrix}0&1\\0&0\end{pmatrix}+c\begin{pmatrix}0&0\\1&0\end{pmatrix}+d\begin{pmatrix}0&0\\0&1\end{pmatrix}\\
&=aM_1+b\frac12(M_2+M_3)+c\frac12(M_2-M_3)+d(M_4-M_1-M_2)\\
&=(a-d)M_1+(\frac{b}{2}+\frac{c}{2}-d)M_2+(\frac{b}{2}-\frac{c}{2})M_3+dM_4.
\end{align}</math>}}
Using the definition of the dual basis and the linearity of <math>M_i^*</math>, we can now specify the solution: We have <math>M_i^*(M_j)=0</math> for <math>i\neq j</math> and <math>M_i^*(M_i)=1</math>, so the following applies
{{Math|<math>\begin{align}
M_1^*&\colon\C^{2\times 2}\to\C,\quad \begin{pmatrix}a&b\\c&d\end{pmatrix}\mapsto a-d,\\
M_2^*&\colon\C^{2\times 2}\to\C,\quad \begin{pmatrix}a&b\\c&d\end{pmatrix}\mapsto \frac{b}{2}+\frac{c}{2}-d,\\
M_3^*&\colon\C^{2\times 2}\to\C,\quad \begin{pmatrix}a&b\\c&d\end{pmatrix}\mapsto \frac{b}{2}-\frac{c}{2},\\
M_4^*&\colon\C^{2\times 2}\to\C,\quad \begin{pmatrix}a&b\\c&d\end{pmatrix}\mapsto d,\\
\end{align}</math>}}
}}
{{:Math for Non-Geeks/Template:Aufgabe
|titel=Elements of the dual space and their kernel
|aufgabe=Let <math>V</math> be an <math>n</math>-dimensional <math>K</math>-vector space and let <math>f,g\in V^*</math>. Show: If <math>\ker(f)=\ker(g)</math>, then there exists a <math>\lambda\in K</math> with <math>g=\lambda f</math>.
|lösungsweg=
For the elements <math>v</math> in the kernel of <math>f</math> and <math>g</math>, we have <math>g(v) = \lambda f(v) = 0</math> for all <math>\lambda \in K</math>. This means that the desired <math>\lambda</math> only depends on the <math>v \in V</math>, which are not in the kernel of <math>f</math> and <math>g</math>. To understand this in more detail, we first look at the dimension of the kernel. Using the [[Math for Non-Geeks/Dimension formula for linear maps#Satz:Dimensionssatz|dimension formula]], we obtain
{{Math|<math>\dim \ker (f)+\dim \operatorname{im}(f)=\dim V</math>}}
and therefore <math>\dim\ker(f) = n - \dim\operatorname{im}(f)</math>. Now <math>\operatorname{im}(f)</math> is a subspace of <math>K</math>. Because <math>K</math> is one-dimensional, we get that the dimension of the image of <math>f</math> is either <math>0</math> or <math>1</math>. Thus, <math>\dim\ker(f) = n</math> or <math>\dim \ker(f) = n-1</math>.
Now we have <math>\ker(f) = \ker(g)</math>. This means that they both have the same dimension. In case <math>\dim\ker(f) = \dim\ker(g) = n</math>, they have the same dimension as <math>V</math>. So in this case, <math>\ker(f) = \ker(g) = V</math>, so <math>f</math> and <math>g</math> are the zero map. Therefore, <math>f = g</math> and we can choose <math>\lambda = 1</math>.
It remains to consider the case <math>\dim\ker(f) = n-1</math>. Here, we actually have vectors in which <math>\lambda</math> plays a role. To compare the maps, it makes sense to look at them as applied to a basis, since according to the [[Math for Non-Geeks/Linear continuation#Satz:Satz von der linearen Fortsetzung|principle of linear continuation]] we know that <math>f</math> and <math>g</math> are already completely determined by their behavior on a basis. It is useful to choose a basis of <math>V</math> with respect to which we already know a lot about our maps <math>f</math> and <math>g</math>. We already know what both do on <math>\ker(f) = \ker(g)</math>. Let <math>b_1, \dots, b_{n-1}</math> be a basis of <math>\ker(f) = \ker(g)</math>. Then we can use the [[Math for Non-Geeks/Basis#Satz:Basisergänzungssatz|basis completion theorem]] to continue this basis to a basis <math>b_1, \dots, b_{n-1}, b_n</math> of <math>V</math>.
Since <math>b_n \not\in\ker(f) = \ker(g)</math>, we know that <math>f(b_n) \ne 0</math> and <math>g(b_n) \ne 0</math>. Furthermore, we know that <math>f(b_i) = g(b_i) = 0</math> for <math>i = 1, \dots, n-1</math>. We now need a candidate for <math>\lambda</math>. Since <math>\lambda</math> depends on elements from <math>V</math> that are not mapped to <math>0</math>, it makes sense to use <math>b_n</math> for the candidate. With <math>\lambda = g(b_n)/f(b_n)</math> we get <math>g(b_n) = \lambda f(b_n)</math>.
To see whether <math>g(v) = \lambda f(v)</math> is valid for all <math>v \in V</math>, by the principle of linear continuation, it is sufficient to check this on our basis <math>b_1, \dots, b_n</math>. We already know that the statement is true for <math>b_n</math>, as well as for <math>b_i</math> with <math>i = 1, \dots, n-1</math>, since <math>g(b_i) = 0 = \lambda \cdot 0 = \lambda \cdot f(b_i)</math>. This proves the statement.
|lösung=The function <math>f\colon V\to K</math> is a linear map between two finite-dimensional vector spaces. From the [[Math for Non-Geeks/Dimension formula for linear maps#Satz:Dimensionssatz|dimension formula]] we get
{{Math|<math>\dim \ker (f)+\dim \operatorname{im}(f)=\dim V</math>}}
Since the image <math>\operatorname{im}(f)</math> is a subspace of <math>K</math>, we have <math>\dim\operatorname{im}(f)\leq \dim(K)=1</math>. Furthermore, <math>\dim V=n</math> applies. We can therefore conclude
{{Math|<math>n=\dim V=\dim \ker (f)+\dim \operatorname{im}(f)\leq \dim \ker (f)+ 1</math>}}
Therefore, <math>\dim \ker(f)\geq n-1</math>. On the other hand, <math>\dim \ker(f)\leq \dim V=n</math>, because the kernel <math>\ker(f)</math> is a subspace of <math>V</math>. Hence, there are only two possibilities:
# The dimension of <math>\ker(f)</math> is <math>n</math>.
# The dimension of <math>\ker(f)</math> is <math>n-1</math>.
Similarly, we can conclude that the dimension of the kernel of <math>g</math> is either <math>n</math> or <math>n-1</math>.
We assume that <math>\ker(f)=\ker(g)</math> and show that there is then a <math>\lambda\in K</math> with <math>g=\lambda f</math>.
For this, we consider the two cases <math>\dim\ker(f)=n</math> and <math>\dim\ker(f)=n-1</math> separately.
{{:Math for Non-Geeks/Template:Fallunterscheidung
|fall1=<math>\dim\ker(f)=n</math>
|beweis1=In this case, the kernel of <math>f</math> is an <math>n</math>-dimensional subspace of the <math>n</math>-dimensional vector space <math>V</math>. Therefore, <math>\ker(f)=V</math> and because of our assumption also <math>\ker(g)=V</math>. Therefore, for all <math>v\in V</math>, we have <math>f(v)=0</math> and <math>g(v)=0</math>. This means <math>f</math> and <math>g</math> are both the zero map, i.e. <math>f=0=g</math>. This proves the statement with <math>\lambda=1</math>.
|fall2=<math>\dim\ker(f)=n-1</math>
|beweis2=In this case, the dimension formula implies
{{Math|<math>\dim\operatorname{im}(f)=\dim V- \dim\ker(f)=n-(n-1)=1</math>}}
Let <math>b_1,\ldots ,b_{n-1}\in V</math> be a basis of <math>\ker(f)</math>. Because <math>\ker(f)=\ker(g)</math>, it is also a basis of <math>\ker(g)</math>. Due to the [[Math for Non-Geeks/Basis#Satz:Basisergänzungssatz|basis completion theorem]], we can complete <math>b_1,\ldots ,b_{n-1}</math> to a basis <math>b_1,\ldots ,b_{n-1},b_n</math> of <math>V</math>.
We then define <math>\alpha:=f(b_n)\in K</math> and <math>\beta:=g(b_n)\in K</math>. The vector <math>b_n</math> is not in <math>\ker(f)</math>, therefore <math>\alpha\neq 0</math>. Define then <math>\lambda:=\tfrac\beta\alpha</math>. We show that <math>g=\lambda f</math>. Because of the [[Math for Non-Geeks/Linear continuation#Satz:Satz von der linearen Fortsetzung|principle of linear continuation]], it is sufficient to prove this equality on the basis of <math>b_1,\ldots ,b_n</math>.
We first consider <math>b_i</math> with <math>i\in\{1,\ldots ,n-1\}</math>. Since <math>b_i\in\ker(f)=\ker(g)</math>, we have that
{{Math|<math>g(b_i)=0=\lambda \cdot 0=\lambda f(b_i).</math>}}
For the basis vector <math>b_n</math>, we have
{{Math|<math>g(b_n)=\beta=\frac\beta\alpha\cdot\alpha=\lambda\cdot\alpha=\lambda f(b_n).</math>}}
So <math>g</math> and <math>\lambda f</math> agree when applied to any basis vector. Thus, <math>g=\lambda f</math>.
}}
}}
{{:Math for Non-Geeks/Template:Gruppenaufgabe
|titel=Dual basis and hyperplanes
|aufgabe=Let <math>V</math> be an <math>n</math>-dimensional <math>K</math>-vector space.
|teilaufgabe1=Let <math>f\in V^*</math> with <math>f\neq0</math>. Show that <math>\dim\ker(f)=n-1</math> holds.
|teilaufgabe2=Let <math>U</math> be an <math>n-1</math>-dimensional subspace of <math>V</math>. Show that there is an element <math>f\in V^*</math> with <math>\ker(f)=U</math>.
|teilaufgabe3=Assuming that <math>K \ne \mathbb{F}_2</math>, is it true that the <math>f</math> from sub-exercise 2 is uniquely determined by the subspace <math>U</math>?
|erklärung=
An <math>n-1</math>-dimensional subspace of an <math>n</math>-dimensional vector space <math>V</math> is also called a ''hyperplane'' in <math>V</math>. For example, the hyperplanes in <math>\R^3</math> are exactly the planes through the origin. The first part of the exercise thus shows that the kernel of a non-zero element in dual space is a hyperplane in <math>V^*</math>.
|teilaufgabe1-lösung=
We can use the [[Math for Non-Geeks/Dimension formula for linear maps#Satz:Dimensionssatz|dimension formula]] to relate the dimension of the kernel to the dimension of <math>V</math>:
{{Math|<math>\dim_K \ker(f) = \dim_K V - \dim_K \operatorname{im}(f) = n - \dim_K \operatorname{im}(f).</math>}}
So we have shifted our problem to the calculation of <math>\dim_K \operatorname{im}(f)</math>. Now <math>\operatorname{im}(f) \subseteq K</math>, that is, <math>\dim_K\operatorname{im}(f) \le \dim_KK = 1</math>. This means that the dimension of <math>\operatorname{im}(f)</math> is either <math>0</math> or <math>1</math>.
We know that <math>f \ne 0</math>, so there is a <math>v \in V</math> with <math>f(v) \ne 0</math>. This means that <math>\operatorname{in}(f) \ne 0</math> and the dimension of <math>\operatorname{in}(f)</math> cannot be <math>0</math>. Therefore, <math>\dim_K\operatorname{im}(f) = 1</math> and we get
{{Math|<math>\dim_K \ker(f) = n - \dim_K \operatorname{im}(f) = n-1.</math>}}
|teilaufgabe2-lösung=
According to the [[Math for Non-Geeks/Linear continuation#Satz:Satz von der linearen Fortsetzung|principle of linear continuation]], a linear mapping is determined by what it does on a basis. To be able to use this principle, we first choose a basis <math>B_U = \{b_1, \dots, b_{n-1}\}</math> of <math>U</math>. The [[Math for Non-Geeks/Basis#Satz:Basisergänzungssatz|basis completion theorem]] then provides us with a vector <math>b_n\in V</math>, such that <math>B = \{b_1, \dots, b_n\}</math> is a basis of <math>V</math>.
According to the principle of linear continuation, we can then define a candidate for the linear map <math>f\colon V \to K</math> by saying what happens on a basis of <math>V</math>. The vectors <math>b_1,\dots, b_{n-1}</math> are elements of <math>U</math>. Since <math>U</math> is to be the kernel of <math>f</math>, we must require <math>f(b_i) = 0</math> for <math>i = 1, \dots, n-1</math>. The last basis vector <math>b_n</math> is not in <math>U</math>. This means that <math>b_n</math> must not lie in the kernel of <math>f</math>. For example, that we can demand <math>f(b_n) = 1</math>. To summarize, we define <math>f\colon V \to K</math> as the linear map with
{{Math|<math>f(b_i) = \begin{cases}
0, & i = 1, \dots, n-1\\
1, & i = n.
\end{cases}</math>}}
Since <math>U</math> is generated by <math>b_1, \dots, b_{n-1}</math>, we have <math>U \subseteq \ker(f)</math>. We therefore only have to show that <math>\ker(f) \subseteq U</math>. For this, let <math>v \in \ker(f)</math>. Because <math>B</math> is a basis of <math>V</math>, we find <math>\lambda_1,\dots, \lambda_n</math> with <math>v = \lambda_1b_1 + \dots + \lambda_n b_n</math>. Now we know that
{{Math|<math>\begin{align}
0 = f(v) &= f(\lambda_1b_1 + \dots + \lambda_nb_n)\\
&= \lambda_1\underset{=0}{\underbrace{f(b_1)}} + \dots + \lambda_{n-1}\underset{=0}{\underbrace{f(b_{n-1})}} + \lambda_n\underset{=1}{\underbrace{f(b_n)}}\\
&= \lambda_n
\end{align}</math>}}
Hence <math>\lambda_n = 0</math> and <math>v = \lambda_1b_1 + \lambda_{n-1}b_{n-1} \in U</math>. Therefore, we have <math>\ker(f) = U</math>.
|teilaufgabe3-lösung=
The mapping <math>f</math> is not unique: We know that <math>f \ne 0</math> because <math>U \ne V</math>. Therefore <math>v \in V</math> exists with <math>f(v) \ne 0</math>. Because <math>K \ne \mathbb{F}_2</math>, there is an element <math>\lambda \in K</math> with <math>\lambda \notin \{0,1\}</math>. Thus <math>\lambda f(v) \ne f(v)</math>. Now consider the linear map <math>g\colon V \to K; w \mapsto \lambda \cdot f(v)</math>. This map has the same kernel as <math>f</math> because <math>g(w) = 0</math> if <math>\lambda f(w) = 0</math>. This is the case if <math>f(w) = 0</math>, since <math>\lambda \ne 0</math>.
Furthermore, <math>g \ne f</math>, because <math>f(v) \ne \lambda f(v) = g(v)</math>. The linear map from the second part is therefore not unique.
}}
In the last task, we required <math>K \ne \mathbb{F}_2</math> because we needed an element in the proof that is neither <math>0</math> nor <math>1</math>. The field <math>\mathbb{F}_2</math> only consists of the elements <math>0</math> and <math>1</math>. This means that if we want to construct a linear map <math>f\colon V \to K</math> that has an <math>n-1</math>-dimensional subspace <math>U</math> as its kernel, then we must define it as
{{Math|<math>f(v) = \begin{cases}
0, & v \in U\\
1, & v\not\in U
\end{cases}</math>}}
This map is linear and it is the only way to have a linear map with kernel <math>U</math>. Thus, for <math>K = \mathbb{F}_2</math> we arrive at a ''different'' result in the last sub-exercise: The map is then unique.
{{:Math for Non-Geeks/Template:Aufgabe
|titel=Basis of the kernel of <math>v_i^*</math>
|aufgabe=
Let <math>V</math> be a <math>K</math>-vector space, <math>B=\{v_1,\ldots, v_n\}\subseteq V</math> a basis and <math>B^*=\{v_1^*,\ldots,v_n^*\}\subseteq V^*</math> is the base dual to <math>B</math>. Show: For each <math>i\in\{1,\ldots,n\}</math> it holds true that
{{Math|<math>\ker(v_i^*)=\operatorname{span}\{v_1,\ldots,v_{i-1},v_{i+1},\ldots,v_n\}.</math>}}
In particular, <math>B\setminus\{v_i\}</math> is a basis of <math>\ker(v_i^*)</math>.
|lösung=
By definition of the dual basis, <math>v_i^*(v_j)=0</math> holds for all <math>j\neq i</math>. Therefore, <math>v_j\in\ker(v_i^*)</math> applies for all <math>j\neq i</math> and since the kernel is a subspace, we have
{{Math|<math>\operatorname{span}\{v_1,\ldots,v_{i-1},v_{i+1},\ldots,v_n\}\subseteq\ker(v_i^*).</math>}}
Since <math>v_i^*(v_i)=1</math> holds, <math>v_i^*</math> is not the zero mapping. With the previous exercise, we conclude <math>\dim\ker(v_i^*)=n-1</math>. Since the <math>v_1,\ldots,v_n</math> are linearly independent, we have <math>\dim \operatorname{span}\{v_1,\ldots,v_{i-1},v_{i+1},\ldots,v_n\}=n-1</math>, and since this span is contained in the kernel of <math>v_i^*</math>, the two subspaces are equal.
}}
{{:Math for Non-Geeks/Template:Gruppenaufgabe
|titel=
|aufgabe=Consider the basis
{{Math|<math>B=\{v_1,v_2,v_3\}=\left\{\begin{pmatrix}2\\1\\0\end{pmatrix}, \begin{pmatrix}0\\2\\1\end{pmatrix}, \begin{pmatrix}1\\2\\1\end{pmatrix}\right\}</math>}}
of <math>\R^3</math>.
|teilaufgabe1=For <math>B</math> determine the dual basis <math>B^*=\{v_1^*,v_2^*,v_3^*\}</math> with <math>v_i^*\colon \R^3\to\R</math> for <math>i=1,2,3</math>.
|teilaufgabe2=Determine the kernel <math>\ker(v_i^*)</math> and draw it in <math>\R^3</math> for <math>i=1,2,3</math>.
|teilaufgabe1-lösung=
The [[Math for Non-Geeks/Matrix of a linear map|matrix of a linear map]] <math>f\colon\R^3\to\R</math> with respect to <math>\{e_1\}</math>. of the canonical bases <math>\{e_1,e_2,e_3\}</math> of <math>\R^3</math> and <math>\{1\}</math> of <math>\R</math> is the uniquely determined matrix <math>\begin{pmatrix}a&b&c\end{pmatrix}</math> with
{{Math|<math>f(\begin{pmatrix}x\\y\\z\end{pmatrix})=\begin{pmatrix}a&b&c\end{pmatrix}\begin{pmatrix}x\\y\\z\end{pmatrix}=ax+by+cz</math>}}
for all <math>(x,y,z)^T\in\R^3</math>.
We are looking for the formula of the linear maps <math>v_i^*\colon\R^3\to \R</math>, <math>i=1,2,3</math>. That means, we determine the three corresponding representative matrices <math>\begin{pmatrix}a_i, b_i, c_i\end{pmatrix}</math> with respect to the canonical bases. By definition of the dual basis, the following should hold
{{Math|<math>\begin{pmatrix}a_1&b_1&c_1\end{pmatrix}\begin{pmatrix}2\\1\\0\end{pmatrix}=1,\quad\begin{pmatrix}a_1&b_1&c_1\end{pmatrix}\begin{pmatrix}0\\2\\1\end{pmatrix}=0,\quad\begin{pmatrix}a_1&b_1&c_1\end{pmatrix}\begin{pmatrix}1\\2\\1\end{pmatrix}=0</math>}}
and the same for <math>i=2,3</math>. If we summarize these equations in matrix form, we get
{{Math|<math>\begin{pmatrix}a_1&b_1&c_1&\\a_2&b_2&c_2\\a_3&b_3&c_3\end{pmatrix}\begin{pmatrix}2&0&1\\1&2&2\\0&1&1\end{pmatrix}=\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}</math>}}
We must therefore determine an [[w:EN:Invertible_matrix|inverse of the matrix]] on the left-hand side of the equation, which has the basis vectors in <math>B</math> as columns.
The inverse is
{{Math|<math>\begin{pmatrix}2&0&1\\1&2&2\\0&1&1\end{pmatrix}^{-1}=\begin{pmatrix}0&1&-2\\-1&2&-3\\1&-2&4\end{pmatrix}=\begin{pmatrix}a_1&b_1&c_1&\\a_2&b_2&c_2\\a_3&b_3&c_3\end{pmatrix}.</math>}}
The rows are the desired dual basis vectors. We therefore have
{{Math|<math>\begin{align}
v_1^*&\colon\R^3\to\R^3,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto \begin{pmatrix}0&1&-2\end{pmatrix}\begin{pmatrix}x\\y\\z\end{pmatrix}=y-2z,\\
v_2^*&\colon\R^3\to\R^3,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto \begin{pmatrix}-1&2&-3\end{pmatrix}\begin{pmatrix}x\\y\\z\end{pmatrix}=-x+2y-3z,\\
v_3^*&\colon\R^3\to\R^3,\quad \begin{pmatrix}x\\y\\z\end{pmatrix}\mapsto \begin{pmatrix}1&-2&4\end{pmatrix}\begin{pmatrix}x\\y\\z\end{pmatrix}=x-2y+4z.
\end{align}</math>}}
|teilaufgabe2-lösung=
From the previous exercise we know that <math>\ker(v_1^*)=\operatorname{span}\{v_2,v_3\}</math>, <math>\ker(v_2^*)=\operatorname{span}\{v_1,v_3\}</math> and <math>\ker(v_3^*)=\operatorname{span}\{v_1,v_2\}</math>. Plotted in <math>\R^3</math>, we obtain a plane spanned by the two vectors in <math>\R^3</math>.
Instead of using the previous exercise, we can also calculate the kernels of the matrices <math>v_i^*</math>:
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>\ker(v_1^*)</math>
|beweisschritt=
The kernel of <math>v_1^*</math> contains all <math>(x,y,z)^T\in\R^3</math> with <math>v_1^*((x,y,z)^T)=y-2z=0</math>, i.e., with <math>y=2z</math>. So the following holds:
{{Math|<math>\ker(v_1^*)=\left\{\begin{pmatrix}a\\2b\\b\end{pmatrix}\mid a,b\in\R\right\}=\operatorname{span}\left\{\begin{pmatrix}1\\0\\0\end{pmatrix},\begin{pmatrix}0\\2\\1\end{pmatrix}\right\}.</math>}}
Note that <math>(1,0,0)^T=v_3-v_2</math>, so the result for the kernel is the same as in the previous exercise.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>\ker(v_2^*)</math>
|beweisschritt=
The kernel of <math>v_2^*</math> contains all <math>(x,y,z)^T\in\R^3</math> with <math>v_2^*((x,y,z)^T)=-x+2y-3z=0</math>, i.e., with <math>x=2y-3z</math>. So the following holds:
{{Math|<math>\ker(v_2^*)=\left\{\begin{pmatrix}2a-3b\\a\\b\end{pmatrix}\mid a,b\in\R\right\}=\operatorname{span}\left\{\begin{pmatrix}2\\1\\0\end{pmatrix},\begin{pmatrix}-3\\0\\1\end{pmatrix}\right\}.</math>}}
Here, also <math>(-3,0,1)^T=v_3-2v_1</math>, so the result is the same as in the previous exercise.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>\ker(v_3^*)</math>
|beweisschritt=
The kernel of <math>v_3^*</math> contains all <math>(x,y,z)^T\in\R^3</math> with <math>v_3^*((x,y,z)^T)=x-2y+4z=0</math>, i.e. with <math>x=2y-4z</math>. So the following holds:
{{Math|<math>\ker(v_2^*)=\left\{\begin{pmatrix}2a-4b\\a\\b\end{pmatrix}\mid a,b\in\R\right\}=\operatorname{span}\left\{\begin{pmatrix}2\\1\\0\end{pmatrix},\begin{pmatrix}-4\\0\\1\end{pmatrix}\right\}.</math>}}
Because <math>(-4,0,1)^T=v_2-2v_1</math>, this agrees with the result determined in the previously exercise.
}}
}}
{{:Math for Non-Geeks/Template:Gruppenaufgabe
|titel=Dual map
|aufgabe=
Let <math>f\colon V\to W</math> be a linear map. We define the map
{{Math|<math>f^*\colon W^*\to V^*, \quad g\mapsto f^*(g):=g\circ f.</math>}}
|teilaufgabe1=Show that <math>f^*</math> is linear.
|teilaufgabe2=Show: <math>(\operatorname{id}_V)^*=\operatorname{id}_{V^*}</math> and <math>(g\circ f)^*=f^*\circ g^*</math> for linear maps <math>f\colon V\to W</math> and <math>g\colon W\to X</math>.
|teilaufgabe3=Show: If <math>f</math> is surjective, then <math>f^*</math> is injective.
|teilaufgabe4=Show: If <math>f</math> is injective, then <math>f^*</math> is surjective.
|teilaufgabe5=Show: If <math>f</math> is bijective, then <math>f^*</math> is bijective and the inverse is given by <math>(f^*)^{-1}=(f^{-1})^*</math>.
|erklärung=
<math>f^*</math> is called the ''dual mapping'' with respect to <math>f</math>. By definition, the dual map therefore receives linear mappings from <math>W</math> to <math>K</math> as input and turns them into linear mappings from <math>V</math> to <math>K</math>. This is achieved by composition with <math>f</math>. A mapping <math>W\overset{g}{\to}K</math> therefore becomes <math>V\overset{f}{\to}W\overset{g}{\to}K</math>. In words, <math>f^*</math> can be described as "execute <math>f</math> first".
|teilaufgabe1-lösung=
For more clarity in the proof, we write <math>\boxplus_{V}</math> or <math>\boxplus_{W}</math> for the addition of linear maps in <math>V^*</math> or <math>W^*</math> and <math>+</math> for the addition in the vector space <math>K</math>. We also write <math>\boxdot_{V}</math> or <math>\boxdot_{W}</math> for the scalar multiplication in <math>V^*</math> or <math>W^*</math> and <math>\cdot</math> for the scalar multiplication in <math>K</math>.
Let <math>g,h\in W^*</math> and <math>\lambda\in K</math>. We have to show that
{{Math|<math>f^*(g\boxplus_W h)=f^*(g)\boxplus_V f^*(h)\quad\text{ and }\quad f^*(\lambda \boxdot_{W}g)=\lambda\boxdot_{V} f^*(g)</math>}}
We must therefore prove the equality of elements in <math>V^*</math>, i.e., of maps <math>V\to K</math>. To do this, we show
{{Math|<math>f^*(g\boxplus_W h)(v)=(f^*(g)\boxplus_V f^*(h))(v)</math> and <math>f^*(\lambda \boxdot_{W}g)(v)=(\lambda \boxdot_{V} f^*(g))(v)</math>}}
for all <math>v\in V</math>.
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>f^*(g\boxplus_W h)=f^*(g)\boxplus_V f^*(h)</math>
|beweisschritt=
Let <math>v\in V</math>. Then
{{Math|<math>\begin{align}
f^*(g\boxplus_W h)(v) &= \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }f^*\right.} \\[0.3em]
&= ((g\boxplus_W h)\circ f)(v) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\circ\right.} \\[0.3em]
&= (g\boxplus_W h)(f(v)) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of } \boxplus_W \right.} \\[0.3em]
&= g(f(v)) + h(f(v)) \\[0,3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\circ\right.} \\[0.3em]
&= (g\circ f)(v) + (h\circ f)(v) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }f^*\right.} \\[0.3em]
&= f^*(g)(v) + f^*(h)(v) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\boxplus_V\right.} \\[0.3em]
&= (f^*(g)(v) \boxplus_V f^*(h))(v). \\[0.3em]
\end{align}</math>}}
Because <math>v\in V</math> was arbitrary, this shows the equality of the maps <math>f^*(g\boxplus_W h)</math> and <math>f^*(g)\boxplus_V f^*(h)</math>.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>f^*(\lambda \boxdot_{W}g)=\lambda\boxdot_{V} f^*(g)</math>
|beweisschritt=
Let <math>v\in V</math>. Then
{{Math|<math>\begin{align}
f^*(\lambda \boxdot_W g)(v) &= \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }f^*\right.} \\[0.3em]
&= ((\lambda \boxdot_W g)\circ f)(v) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\circ\right.} \\[0.3em]
&= (\lambda \boxdot_W g)(f(v)) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of } \boxdot_W\right.} \\[0.3em]
&= \lambda\cdot g(f(v)) \\[0,3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\circ\right.} \\[0.3em]
&= \lambda\cdot (g\circ f)(v) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }f^*\right.} \\[0.3em]
&= \lambda\cdot (f^*(g))(v)\\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\boxdot_V\right.} \\[0.3em]
&= (\lambda\boxdot_V f^*(g))(v). \\[0.3em]
\end{align}</math>}}
Because <math>v\in V</math> was arbitrary, this shows the equality of the maps <math>f^*(\lambda\boxdot_W g)</math> and <math>\lambda \boxdot_V f^*(g)</math>.
}}
|teilaufgabe2-lösung=
We show <math>(\operatorname{id}_V)^*(g)=g</math> for all <math>g\in V^*</math>. It then follows that <math>(\operatorname{id}_V)^*</math> is the identity on <math>V^*</math>. Let <math>g\in V^*</math>. By definition of the dual map, we have
{{Math|<math>(\operatorname{id}_V)^*(g)=g\circ \operatorname{id}_V=g.</math>}}
Since <math>g\in V^*</math> was arbitrary, the statement is shown.
Now let <math>f\colon V\to W</math> and <math>g\colon W\to X</math>. Then <math>g\circ f\colon V\to X</math> applies, i.e. <math>(g\circ f)^*\colon X^*\to V^*</math>. Furthermore, <math>f^*\colon W^*\to V^*</math> and <math>g^*\colon X^*\to W^*</math> and therefore <math>f^*\circ g^*\colon X^*\to V^*</math>. To show the equality of the maps <math>(g\circ f)^*=f^*\circ g^*</math>, we show that <math>(g\circ f)^*(k)=(f^*\circ g^*)(k)</math> holds for all <math>k\in X^*</math>. So if <math>k\in X^*</math>, then we get
{{Math|<math>\begin{align}
(g\circ f)^*(k) &= \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }(g\circ f)^*\right.} \\[0.3em]
&= k\circ (g\circ f) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{associativity of }\circ\right.} \\[0.3em]
&= (k\circ g)\circ f \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }g^*\right.} \\[0.3em]
&={\color{OliveGreen}\underbrace{\color{black}g^*(k)}_{\in W^*}\color{black}\circ f }\\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }f^*\right.} \\[0.3em]
&=f^*(g^*(k)) \\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of }\circ\right.} \\[0.3em]
&= (f^*\circ g^*)(k).
\end{align}</math>}}
Because <math>k\in X^*</math> was arbitrary, the statement is shown.
|teilaufgabe3-lösung=
Let <math>f\colon V\to W</math> be surjective. We want to show that <math>f^*\colon W^*\to V^*</math> is injective. Due to the linearity of <math>f^*</math>, it is sufficient to show that <math>\ker(f^*)=\{0_{W^*}\}</math>. Let <math>g\in W^*</math> with <math>f^*(g)=0_{V^*}</math>. This means that <math>g</math> maps from <math>W</math> to <math>K</math> and <math>f^*(g)=g\circ f</math> is the zero mapping from <math>V</math> to <math>K</math>. We want to conclude that <math>g</math> is the zero mapping in <math>W^*</math>, i.e. that <math>g(w)=0_K</math> for all <math>w\in W</math>. For this, let <math>w\in W</math> be arbitrary. Because <math>f</math> is surjective, there exists an <math>v\in V</math> with <math>f(v)=w</math>. It follows that
{{Math|<math>g(w)=g(f(v))=(g\circ f)(v)=f^*(g)(v)=0_{V^*}(v)=0_K.</math>}}
Because <math>w\in W</math> was arbitrary, we conclude <math>g=0_{W^*}</math>.
|teilaufgabe4-lösung=
Let <math>f\colon V\to W</math> be injective. We want to show that <math>f^*\colon W^*\to V^*</math> is surjective. So let <math>g\in V^*</math> be arbitrary. This means that <math>g</math> is a linear map from <math>V</math> to <math>K</math>. We want to define a map <math>h\in W^*</math> from <math>W</math> to <math>K</math> such that <math>f^*(h)=h\circ f=g</math>.
Because <math>f</math> is injective, the restriction of <math>f</math> to the image <math>f(V)</math> of <math>f</math> is an isomorphism. We denote this restriction by <math>\tilde f\colon V\to f(V)</math>. Then <math>\tilde{f}^{-1}\colon f(V)\to V</math> and the following holds
{{Math|<math>\tilde{f}^{-1}\circ f=\tilde{f}^{-1}\circ \tilde{f}=\operatorname{id}_V.</math>}}
Because <math>g</math> is defined on <math>V</math>, we can define and obtain <math>h:=g\circ\tilde{f}^{-1}</math>:
{{Math|<math>f^*(h)=h\circ f=(g\circ \tilde{f}^{-1})\circ f=g\circ (\tilde{f}^{-1}\circ f)=g\circ \operatorname{id}_V=g.</math>}}
Because <math>g\in V^*</math> was arbitrary, the surjectivity of <math>f^*</math> is shown.
|teilaufgabe5-lösung=
If <math>f\colon V\to W</math> is bijective, then it follows from the previous two sub-exercises that <math>f^*</math> is also bijective. We calculate that <math>(f^{-1})^*</math> is the inverse of <math>f</math>: From sub-exercise 2 we get
{{Math|<math>f^*\circ (f^{-1})^*=(f^{-1}\circ f)^*=\left(\operatorname{id}_V\right)^*=\operatorname{id}_{V^*}.</math>}}
Analogously, one can show <math>(f^{-1})^*\circ f^*=\operatorname{id}_{W^*}</math>.
}}
{{#invoke:Math for Non-Geeks/Seite|unten}}
{{BookCat}}
ff866pc7ntr6x98scmua5ind4oksuoq
Math for Non-Geeks/Matrix multiplication
0
473516
4669635
4635316
2026-09-11T01:00:46Z
JackBot
396820
Formatting, [[Special:UncategorizedPages]]
4669635
wikitext
text/x-wiki
{{#invoke:Math for Non-Geeks/Seite|oben}}
In this article, you learn how to multiply matrices. We will see that matrix multiplication is equivalent to the composition of linear maps. We will also prove some properties of the matrix multiplication.
== Introduction ==
=== How can we multiply matrices? ===
In the article on [[Math for Non-Geeks/Matrix of a linear map|matrices of linear maps]], we learned how we can use matrices to describe linear maps <math>f\colon V\to W</math> between finite-dimensional vector spaces <math>V</math> and <math>W</math>. This requires fixing a basis <math>B</math> of <math>V</math> and a basis <math>C</math> of <math>W</math>, with respect to which we can define the mapping matrix <math>M^B_C(f)</math>. In a plane of coordinates, this matrix describes what the linear mapping <math>f</math> does with a vector <math>v\in V</math>:
{{Math|<math>M^B_C(f)\cdot k_B(v)=k_C(f(v))</math>}}
where <math>k_B\colon V\to K^n</math> is the ''coordinate mapping'' with respect to <math>B</math>, which maps a vector <math>v=\lambda_1\cdot b_1+\ldots+\lambda_n\cdot b_n</math> to the coordinate vector <math>(\lambda_1,\ldots,\lambda_n)^T</math> with respect to <math>B</math>. Similarly, <math>k_C\colon W\to K^m</math> is the coordinate mapping with respect to <math>C</math>.
We can concatenate linear maps <math>f\colon V\to W</math> and <math>g\colon W\to X</math> by executing them one after the other, which results in a linear map <math>g\circ f \colon V\to X</math>. Can we define a suitable "concatenation" of matrices? By suitable, we mean that the "concatenation" of the matrices corresponding to <math>f</math> and <math>g</math> should become the matrix of the map <math>g\circ f</math>. We will call this "concatenation" of the matrices also the ''matrix product'' since it will turn out to behave almost like a product of numbers.
For example, let's consider two matrices <math>A\in K^{m\times l}</math> and <math>B\in K^{p\times n}</math> with the corresponding linear mas
{{Math|<math>f_A\colon K^l\to K^m,\quad x\mapsto Ax</math>}}
and
{{Math|<math>f_B\colon K^p\to K^n,\quad x\mapsto Bx</math>}}
given by [[Math for Non-Geeks/Introduction: Matrices#Definition:Def-Matrix-Vektor-Multiplikation|matrix-vector-multiplication]]. Then <math>A</math> is the matrix of <math>f_A</math> (with respect to the standard bases in <math>K^l</math> and <math>K^m</math>), and <math>B</math> is the matrix of <math>f_B</math> (with respect to the standard bases in <math>K^p</math> and <math>K^n</math>). The product <math>A\cdot B</math> of <math>A</math> and <math>B</math> should then be the matrix of <math>f_A\circ f_B</math>.
However, in order to be able to execute the maps <math>f_A</math> and <math>f_B</math> one after the other, the target space of <math>f_B</math> must be equal to the space on which <math>f_A</math> is defined. This means that <math>K^p=K^l</math>, i.e. <math>p=l</math>. Therefore, the number of columns of <math>A</math> must be equal to the number of rows of <math>B</math>, otherwise we cannot define the product matrix <math>A\cdot B</math>.
=== Computing the product matrix ===
What is the product <math>A\cdot B</math> of <math>A</math> and <math>B</math> corresponding to the map <math>f_A\circ f_B\colon K^n\to K^m</math>? To compute it, we need to calculate the images of the standard basis vectors <math>e_1,\ldots,e_n\in K^n</math> under the map <math>f_A\circ f_B</math>. They will form the columns of the matrix of <math>f_A\circ f_B</math>, that is, the matrix <math>A\cdot B</math>.
We denote the entries of <math>A</math> by <math>a_{ij}</math> and those of <math>B</math> by <math>b_{ij}</math>, i.e. <math>A=(a_{ij})\in K^{m\times p}</math> and <math>B=(b_{ij})\in K^{p\times n}</math>. We also denote the desired matrix of <math>f_A\circ f_B</math> by <math>A\cdot B=C=(c_{ij})\in K^{m\times n}</math>.
For <math>i\in\{1,\ldots,m\}</math> and <math>j\in\{1,\ldots, n\}</math>, the entry <math>c_{ij}</math> is given by the definition of the matrix representing <math>f_A\circ f_B</math> by the <math>i</math>-th entry of the vector <math>f_A(f_B(e_j))\in K^m</math>. We can easily calculate it using the definition of <math>f_A</math> and <math>f_B</math> using the definition of [[Math for Non-Geeks/Introduction: Matrices#Definition:Def-Matrix-Vektor-Multiplikation|matrix-vector-multiplication]]:
{{Math|<math>\begin{align}
c_{ij}=&(f_A(f_B(e_j)))_i \\[0.3em]
=&(A\cdot(f_B(e_j)))_i\\[0.3em]
& {\color{OliveGreen}\left\downarrow\ \text{definition of matrix-vector-multiplication for } A \right.} \\[0.3em]
= &\sum_{k=1}^n a_{ik}(f_B(e_j))_k\\[0.3em]
= &\sum_{k=1}^n a_{ik}(B\cdot e_j)_k\\[0.3em]
& {\color{OliveGreen}\left\downarrow\ (B\cdot e_j)_k=b_{kj} \right.} \\[0.3em]
= &\sum_{k=1}^n a_{ik}b_{kj}
\end{align}</math>}}
This defines all entries of the matrix <math>C</math> and we conclude
{{Math|<math>C=(\sum_{k=1}^n a_{ik}b_{kj})_{i,j}\in K^{m\times n}.</math>}}
This is exactly the ''product'' <math>C=A\cdot B</math> of the two matrices <math>A</math> and <math>B</math>.
== Definition and rule of thumb ==
Mathematically, we can also understand matrix multiplication as an [[Math for Non-Geeks/operation|operation]] (just as the multiplication of real numbers).
{{:Math for Non-Geeks/Template:Definition
|titel=Matrix multiplication
|definition=The matrix multiplication is an operation
{{Math|<math>\cdot \, \colon K^{m\times p} \times K^{p\times n} \to K^{m\times n}</math>.}}
It sends two matrices <math>A=(a_{ij}) \in K^{m\times p}</math> and <math>B=(b_{ij}) \in K^{p\times n}</math> to the matrix <math>A\cdot B=C=(c_{ij}) \in K^{m\times n}</math>, given by
{{Math|<math>c_{ij} = \sum_{k=1}^p a_{ik}b_{kj}</math>}}
for <math>i\in\{1,\ldots,m\}</math> and <math>j\in\{1,\ldots,n\}</math>.
}}
However, there is an important difference to the multiplication of real numbers: With matrices, we have to make sure that the dimensions of the matrices we want to multiply match.
{{:Math for Non-Geeks/Template:Hinweis
|The two matrices do ''not'' have to be of the ''same'' size, but the number of columns of the matrix <math>A</math> must be equal to the number of rows of the matrix <math>B</math>. The result then has the number of rows of the left-hand matrix <math>A</math> and the number of columns of the right-hand matrix <math>B</math>. This means that two matrices <math>A \in K^{m\times l}; \, B \in K^{p\times n}</math> can only be multiplied if <math> l = p </math>.
}}
{{:Math for Non-Geeks/Template:Warnung
|The two matrices <math>A \in K^{m\times l}; \, B \in K^{p\times n}</math> with <math> l \neq p </math> can '''never''' be multiplied.
}}
[[File:Matrix multiplication qtl2.svg|thumb|300px|To calculate the matrix product, we use the scheme "row times column".]]
'''Rule of thumb: row times column'''
According to the definition, each entry in the product <math>A\cdot B</math> is the sum of the component-wise multiplication of the elements of the <math>i</math>-th row of <math>A</math> with the <math>k</math>-th column of <math>B</math>. This procedure can be remembered as ''row times column'', as shown in the figure on the right.
== Concrete example ==
=== Example 1 ===
We consider the following two matrices <math>A\in \R^{2\times 3}</math> and <math>B\in\R^{3\times 4}</math>:
{{Math|<math>\begin{align}
A=
\begin{pmatrix}
2&0&-1\\
0&1&3
\end{pmatrix} \text{ and}\\[0.5em]
B=\begin{pmatrix}
1&0&-1&0\\
1&3&-2&-1\\
0&0&1&2
\end{pmatrix}
\end{align}</math>}}
We are looking for the matrix product <math>C=A\cdot B\in\R^{2\times 4}</math>. This matrix has the form
{{Math|<math>
C=\begin{pmatrix}
c_{11}&c_{12}&c_{13}&c_{14}\\
c_{21}&c_{22}&c_{23}&c_{24}
\end{pmatrix}</math>}}
We have to calculate the individual entries <math>c_{ik}</math>. We will do this here in detail for the entry <math>c_{23}</math>. The calculation of the other entries works analogously.
According to the formula
{{Math|<math>\begin{align}
c_{23}=&\sum_{j=1}^3a_{2j}b_{j3}\\
=&a_{21}b_{13}+a_{22}b_{23}+a_{23}b_{33}\\
& {\color{OliveGreen}\left\downarrow \text{ reading off entries of } A \text{ and } B \right.}\\
=&0\cdot (-1)+1\cdot (-2)+3\cdot 1 \\
=&1
\end{align}</math>}}
This calculation can also be seen as the "multiplication" of the 2nd row of <math>A</math> with the 3rd column of <math>B</math>. To illustrate this, we mark the entries from the sum in the matrices. We have the sum
{{Math|<math>c_{23}={\color{Orange} 0}\cdot {\color{RoyalBlue}(-1)}+{\color{Orange}1}\cdot {\color{RoyalBlue}(-2)}+{\color{Orange}3}\cdot {\color{RoyalBlue}1}
</math>}}
These are the following entries in the matrices:
{{Math|<math>\begin{align}
A=
\begin{pmatrix}
2&0&-1\\
{\color{Orange}0}&{\color{Orange}1}&{\color{Orange}3}
\end{pmatrix} \text{ and }
B=\begin{pmatrix}
1&0&{\color{RoyalBlue}-1}&0\\
1&3&{\color{RoyalBlue}-2}&-1\\
0&0&{\color{RoyalBlue}1}&2
\end{pmatrix}
\end{align}</math>}}
In this way, we can also determine the other entries of <math>C</math> and obtain
{{Math|<math>
C=\begin{pmatrix}
2&0&-3&-2\\
1&3&1&5
\end{pmatrix}</math>}}
=== Example 2 ===
We consider the following matrices <math>A\in \R^{1\times 3}</math> and <math>B\in\R^{3\times 1}</math>:
{{Math|<math>
A=\begin{pmatrix}
5&2&-1
\end{pmatrix}\text{ and }
B=\begin{pmatrix}
1\\
0\\
4
\end{pmatrix}
</math>}}
In this case, we can calculate both <math>A\cdot B</math> and <math>B\cdot A</math>. Let <math>C:=A\cdot B</math>. Then <math>C</math> is a <math>1\times 1</math>-matrix <math>C=(c_{11})</math>. We calculate its only entry:
{{Math|<math>\begin{align}
c_{11}=5\cdot 1+2\cdot 0+(-1)\cdot 4=1
\end{align}</math>}}
Thus, <math>A\cdot B=(1)</math>.
Let <math>D:=B\cdot A</math>. Then <math>D</math> is a <math>3\times 3</math>-matrix. We can calculate the entries of <math>D</math> by the scheme "row times column". For example, the first entry of <math>D</math> is the first row of <math>B</math> times the first column of <math>A</math>, i.e. <math>1\cdot 5=5</math>. If we do this with each entry, we get
{{Math|<math>
B\cdot A=D=\begin{pmatrix}
5&2&-1\\
0&0&0\\
20&8&-4
\end{pmatrix}
</math>}}
=== Example 3 ===
In this example, we want to illustrate that the matrix multiplication really corresponds to "concatenating two matrices". That means, if we have two matrices <math>A</math> and <math>B</math> that we apply to a vector <math>v</math>, then we always have <math>(A\cdot B)v=A(Bv)</math>. As an example, let <math>A\in \C^{2\times 2}</math> and <math>B\in \C^{2\times 3}</math> be the following matrices with entries in <math>\C</math>:
{{Math|<math>
A=\begin{pmatrix}
2\mathrm i&0\\
-1&2
\end{pmatrix}
\text{ and }
B=\begin{pmatrix}
1&1-2\mathrm i&-1\\1+\mathrm i&2-\mathrm i&0
\end{pmatrix}</math>}}
Let further <math>v=(2,0,1)^T</math>. We check that <math>(A\cdot B)v=A(Bv)</math>. To do so, we first calculate the matrix product <math>A\cdot B</math>:
{{Math|<math>
A\cdot B
=\begin{pmatrix}
2\mathrm i&4+2\mathrm i&-2\mathrm i\\
1+2\mathrm i&3&1
\end{pmatrix}
</math>}}
Now we multiply this matrix with <math>v</math>:
{{Math|<math>
(A\cdot B)v=\begin{pmatrix}
2\mathrm i&4+2\mathrm i&-2\mathrm i\\
1+2\mathrm i&3&1
\end{pmatrix}
\begin{pmatrix}2\\0\\1\end{pmatrix}=\begin{pmatrix}2\mathrm i\\ 3+4\mathrm i\end{pmatrix}
</math>}}
Next, we compute <math>A(Bv)</math>.
{{Math|<math>
Bv=B=\begin{pmatrix}
1&1-2\mathrm i&-1\\1+\mathrm i&2-\mathrm i&0
\end{pmatrix}\begin{pmatrix}2\\0\\1\end{pmatrix}=\begin{pmatrix}1\\ 2+2\mathrm i\end{pmatrix}
</math>}}
We now apply <math>A</math> to this vector:
{{Math|<math>
A(Bv)=\begin{pmatrix}
2\mathrm i&0\\
-1&2
\end{pmatrix}\begin{pmatrix}1\\ 2+2\mathrm i\end{pmatrix}=\begin{pmatrix}2\mathrm i\\ 3+4\mathrm i\end{pmatrix}
</math>}}
Indeed, here we have <math>(A\cdot B)v=A(Bv)</math>.
== Properties of matrix multiplication ==
We now collect a few properties of the matrix multiplication.
=== Shortening rule for matrices representing linear maps ===
The following theorem shows that matrix multiplication actually reflects the composition of linear mappings.
{{:Math for Non-Geeks/Template:Satz
|titel=Shortening rule for matrices representing linear maps
|satz=
Let <math>f\colon V\to W</math> and <math>g\colon W\to X</math> be linear maps between finite-dimensional vector spaces. Furthermore, let <math>B=\{v_1,\ldots,v_m\}</math> be a basis of <math>V</math>, let <math>C=\{w_1,\ldots,w_n\}</math> be a basis of <math>W</math> and <math>D=\{x_1,\ldots,x_s\}</math> a basis of <math>X</math>. Then we can "shorten the <math>C</math>":
{{Math|<math>M^B_D(g\circ f)=M^C_D(g)\cdot M^B_C(f).</math>}}
|beweis=
We set <math>h=g\circ f</math> and <math>(h_{ij})_{ij}=M^B_D(h)\in K^{s\times m}</math>. Further, the matrices of <math>f</math> and <math>g</math> are given by <math>M^B_C(f)=(f_{ij})_{ij}\in K^{n\times m}</math> and <math>M^C_D(g)=(g_{ij})_{ij}\in K^{s\times n}</math>.
By definition of the matrix of a linear map, we know that the <math>h_{ij}</math> are the unique scalars with
{{Math|<math>h(v_j)=\sum_{i=1}^s h_{ij}x_i</math>}}
for all <math>j\in\{1,\ldots,m\}</math>. In order to prove <math>(h_{ij})=(g_{ij})(f_{ij})</math>, we need to verify that
{{Math|<math>h_{ij}=\sum_{k=1}^ng_{ik}f_{kj}</math>}}
And indeed,
{{Math|<math>\begin{align}
h(v_j) &=\, g(f(v_j))\\[0.3em]
& {\color{OliveGreen} \left\downarrow \text{definition of } M^B_C(f) \right.}\\[0.3em]
&= \, g\left(\sum_{k=1}^n f_{kj}w_k\right) \\[0.3em]
& {\color{OliveGreen} \left\downarrow \text{linearity of } g \right.}\\[0.3em]
&= \, \sum_{k=1}^n f_{kj}g(w_k) \\[0.3em]
& {\color{OliveGreen} \left\downarrow \text{definition of } M^C_D(g) \right.}\\[0.3em]
&= \, \sum_{k=1}^nf_{kj}\sum_{i=1}^sg_{ik}x_i \\[0.3em]
&= \, \sum_{i=1}^s\left(\sum_{k=1}^ng_{ik}f_{kj}\right) x_i.
\end{align}</math>}}
By uniqueness of the coordinates in the linear combination of <math>x_i</math>, we conclude <math>h_{ij}=\sum_{k=1}^ng_{ik}f_{kj}</math>.
}}
{{:Math for Non-Geeks/Template:Warnung|For the shortening rule, it is important that the same ordered basis <math>C</math> of <math>W</math> is chosen in both cases for the matrices representing <math>f</math> and <math>g</math>. If <math>M^{\tilde{C}}_D(g)</math> is taken with respect to a different basis <math>\tilde{C}\neq C</math> of <math>W</math>, then the shortening rule is no longer true: The following is in general a '''false''' statement:
{{Math|<math>M^B_D(g\circ f)=M^{\tilde{C}}_D(g)\cdot M^B_C(f).</math>}}
As matrices representing linear maps depend on the order of the basis vectors, the shortening rule also becomes false if <math>\tilde{C}</math> is a rearrangement of <math>C</math>.
}}
=== Associativity of matrix multiplication ===
{{:Math for Non-Geeks/Template:Satz
|titel=Associativity of matrix multiplication
|satz=For <math>A \in K^{m\times n}, \, B \in K^{n\times l},\, C \in K^{l\times k}</math> we have
{{Math|<math>(A \cdot B) \cdot C = A \cdot (B \cdot C).</math>}}
|beweis=
First, we check that the sizes of the matrices that we want to multiply are compatible. This is directly visible for the products <math>A\cdot B</math> and <math>B\cdot C</math>. Now <math>A\cdot B\in K^{m\times l}</math> and <math>B\cdot C\in K^{n\times k}</math>, so the products on both sides of the equation are well-defined: they are both in <math>K^{m\times k}</math>.
Now we look at the individual components of the matrices to verify the equality. Let <math>A=(a_{ij}),\, B=(b_{ij}),\, C=(c_{ij})</math>.
{{Math|<math>\begin{align}
((A\cdot B)\cdot C)_{ij} &=\, \sum_{s=1}^l (A\cdot B)_{is} c_{sj} =\\[0.3em]
&= \, \sum_{s=1}^{l}\left(\sum_{t=1}^{n} a_{it}b_{ts}\right) c_{sj}\\[0.3em]
& {\color{OliveGreen} \left\downarrow \text{by distributivity in } K \right.}\\[0.3em]
&= \, \sum_{s=1}^{l}\sum_{t=1}^{n}(a_{it}b_{ts})c_{sj} \\[0.3em]
& {\color{OliveGreen} \left\downarrow \text{by associativity in } K \right.}\\[0.3em]
&= \, \sum_{s=1}^{l}\sum_{t=1}^{n}a_{it}(b_{ts}c_{sj}) \\[0.3em]
& {\color{OliveGreen} \left\downarrow \text{by distributivity in } K \right.}\\[0.3em]
&= \, \sum_{t=1}^{l}a_{it}\left(\sum_{s=1}^{n}b_{ts}c_{sj}\right) \\[0.3em]
&= \, (A\cdot (B\cdot C))
\end{align}</math>}}
}}
=== Compatibility with scalar multiplication ===
{{:Math for Non-Geeks/Template:Satz
|titel=Compatibility with scalar multiplication
|satz= Let <math>\beta\in K,\ A = ( a_{ij} ) \in K^{m \times n}</math> and <math>B = ( b_{ij} ) \in K^{n \times p}</math>. Then:
{{Math|<math>\beta \cdot (A \cdot B) = (\beta \cdot A)\cdot B = A \cdot (\beta \cdot B)</math>}}
Note that "<math>\cdot</math>" refers to both scalar multiplication ("scalar times matrix") and matrix multiplication ("matrix times matrix").
|beweis=
{{Math|<math>\begin{align}
(\beta \cdot ( A \cdot B))_{ik} &= \, \beta \left(\sum_{j=1}^n a_{ij}b_{jk}\right) \\[0.3em]
&{\color{OliveGreen} \left\downarrow\text{by distributivity in } K\right.}\\[0.3em]
&= \, \sum_{j=1}^n \beta (a_{ij}b_{jk})\\
&{\color{OliveGreen} \left\downarrow\text{by associativity in } K\right.}\\[0.3em]
&= \, \sum_{j=1}^n (\beta a_{ij})b_{jk} &=\, ((\beta \cdot A) \cdot B)_{ik}\\
&{\color{OliveGreen} \left\downarrow\text{by commutativity in } K \right.}\\[0.3em]
&= \, \sum_{j=1}^n (a_{ij}\beta)b_{jk}\\
&{\color{OliveGreen} \left\downarrow\text{by associativity in } K\right.}\\[0.3em]
&= \, \sum_{j=1}^n a_{ij}(\beta b_{jk}) &=\, (A \cdot (\beta \cdot B))_{ik}\\
\end{align}</math>}}
}}
=== Distributivity of matrix multiplication ===
Here we must be careful that the sizes of the matrices are compatible.
{{:Math for Non-Geeks/Template:Satz
|titel=First distributive law
|satz=For <math>A = (a_{ij}) \in K^{m\times n}, \, B = (b_{ij}) \in K^{m\times n}, \, C = (c_{ij}) \in K^{n\times p}</math> we have
{{Math|<math>(A + B) \cdot C = A \cdot C + B \cdot C</math>}}
|beweis=
<math>\begin{align}
((A + B) \cdot C)_{ik} \,&= \, \sum_{j=1}^n (A+B)_{ij} c_{jk} \,= \\[0.3em]
&{\color{OliveGreen} \left\downarrow\text{by definition}\right.}\\[0.3em]
&=\, \sum_{j=1}^{n} (a_{ij} + b_{ij})c_{jk} \\
&{\color{OliveGreen} \left\downarrow\text{by distributivity in } K\right.}\\[0.3em]
&=\, \sum_{j=1}^{n} (a_{ij}c_{jk} + b_{ij}c_{jk})\\
&{\color{OliveGreen} \left\downarrow\text{by commutativity in }K\right.}\\[0.3em]
&=\, \sum_{j=1}^{n} (a_{ij}c_{jk}) + \sum_{j=1}^{n} (b_{ij}c_{jk})\\
&{\color{OliveGreen} \left\downarrow\text{by definition}\right.}\\[0.3em]
&=\,(A\cdot C)_{ik} + ( B \cdot C)_{ik}\\
\end{align}</math>
}}
{{:Math for Non-Geeks/Template:Satz
|titel=Second distributive law
|satz=For <math>A = (a_{ij}) \in K^{m\times n}, \, B = (b_{ij}) \in K^{n\times p}, \, C = (c_{ij}) \in K^{n\times p}</math> we have
{{Math|<math>A \cdot ( B + C) = A \cdot B + A \cdot C</math>}}
|beweis=
<math>\begin{align}
(A \cdot(B + C))_{ik}\,&= \,\sum_{j=1}^n a_{ij}(B+C)_{jk} \,= \\[0.3em]
&{\color{OliveGreen} \left\downarrow\text{by definition}\right.}\\[0.3em]
&=\, \sum_{j=1}^{n} a_{ij}(b_{jk} + c_{jk})\\
&{\color{OliveGreen} \left\downarrow\text{by distributivity in }K\right.}\\[0.3em]
&= \, \sum_{j=1}^{n} (a_{ij}b_{jk} + a_{ij}c_{jk})\\
&{\color{OliveGreen} \left\downarrow\text{by commutativity in }K\right.}\\[0.3em]
&= \, \sum_{j=1}^{n} (a_{i}b_{jk}) + \sum_{j=1}^{n} (a_{ij}c_{jk})\\
&{\color{OliveGreen} \left\downarrow\text{by definition}\right.}\\[0.3em]
&=\, (A \cdot B)_{ik} + (A \cdot C)_{ik}\\
\end{align} </math>
}}
=== Left and right neutral element of matrix multiplication ===
We denote the entries of the unit matrix with <math>\delta_{ij}</math>, i.e. <math>I_m=(\delta_{ij})</math>. Then
{{Math|<math>\delta_{ij}=\begin{cases}0 & \text{if }i\neq j,\\ 1 & \text{if }i=j.\end{cases}</math>}}
{{:Math for Non-Geeks/Template:Satz
|titel=The unit matrix is a left- and right-neutral element of the matrix multiplication
|satz=Let <math>M=(m_{ij}) \in K^{m\times n}</math>. Then
{{Math|<math>I_m\cdot M = M = M \cdot I_n</math>}}
|beweis=
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>I_m\cdot M = M</math>
|beweisschritt=We prove this equality by direct multiplication. The following holds for all <math> i \in \{1, \ldots , m\}</math> and for all <math>j\in \{1, \ldots, n\}</math>:
<math>(I_m \cdot M)_{ij} = \sum_{k=1}^m \delta_{ik}\cdot m_{kj} = m_{ij} </math>
For the last equality, we used the fact that <math> \delta_{ij} = 0 </math> if <math> i \neq j</math> and <math>\delta_{ii} = 1</math>. Since each entry of <math>I_m\cdot M</math> matches the entry of <math>M</math> at the same position, the two matrices are equal.
}}
{{:Math for Non-Geeks/Template:Beweisschritt
|ziel=<math>M\cdot I_n = M</math>
|beweisschritt= We proceed as in the first proof step. For all <math> i \in \{1, \ldots , m\}</math> and for all <math>j\in \{1, \ldots, n\}</math> we have:
<math>(M\cdot I_n)_{ij} = \sum_{k=1}^n m_{ik}\cdot\delta_{kj} =m_{ij}</math>
This proves equality of both sides.
}}
In other words, the unit matrix (of the correct size) is the left- or right-neutral element with respect to matrix multiplication.
}}
=== Non-commutativity ===
{{:Math for Non-Geeks/Template:Beispiel
|titel=Non-commutativity of <math>2\times 2</math>-matrices
|beispiel=
For <math>2\times 2</math> matrices, we can see that commutativity fails within the following example: On the one hand
{{Math|<math>\begin{pmatrix}1 & 1\\ 0 & 1\end{pmatrix}\cdot \begin{pmatrix}0 & 0\\ 1 & 0\end{pmatrix} = \begin{pmatrix}1 & 0\\ 1 & 0\end{pmatrix}</math>}}
and on the other hand
{{Math|<math>\begin{pmatrix}0 & 0\\ 1 & 0\end{pmatrix}\cdot \begin{pmatrix}1 & 1\\ 0 & 1\end{pmatrix} = \begin{pmatrix}0 & 0\\ 1 & 1\end{pmatrix}</math>}}
So the ''order'' of the matrix multiplication ''matters''!
}}
{{:Math for Non-Geeks/Template:Warnung
|In general, <math>A \cdot B \neq B \cdot A</math>, so the matrix product is '''not commutative'''.
The commutative law only applies in a few special cases (e.g. products of diagonal matrices).
As the number of rows and columns of the matrices must match, it is even possible that one of the two products is not even defined! For example, for <math> A \in K^{4\times 3} \text{ and } B \in K^{3\times 2}</math> the product <math>A \cdot B \in K^{4\times 2}</math> is defined, but the product <math>B \cdot A</math> is not defined.
}}
== Further reading ==
{{:Math for Non-Geeks/Template:Hinweis|
If we multiply two <math>n\times n</math>-matrices, the result is again an <math>n\times n</math>-matrix. We now know two inner operations on the set <math>K^{n\times n}</math>: the addition of matrices
{{Math|<math>+\;\colon K^{n\times n}\to K^{n\times n},\quad (a_{ij}) + (b_{ij})=(a_{ij}+b_{ij})</math>}}
and the matrix multiplication
{{Math|<math>\cdot \;\colon K^{n\times n}\to K^{n\times n},\quad (a_{ij}) \cdot (b_{ij})=(\sum_{k=1}^n a_{ik}b_{kj}).</math>}}
From the article on the [[Math for Non-Geeks/Vector space structure on matrices|vector space structure on matrices]], we already know that <math>(K^{n\times n},+)</math> is an Abelian group. It follows from the properties of matrix multiplication that <math>(K^{n\times n},+,\cdot)</math> is even a unital [[Math for Non-Geeks/Rings|ring]] (i.e., a ring that has a unit element): The multiplication <math>\cdot</math> is associative, there is a neutral element <math>I_n</math> and the distributive laws apply.
However, the ring of matrices is generally not commutative, as we have seen above. Also note that we only have such a ring structure for square matrices, as otherwise the multiplication of two elements is not defined.
}}
{{#invoke:Math for Non-Geeks/Seite|unten}}
{{BookCat}}
rlfwu3nh6qu0roqe9useobrnp7d8zqi
U.S. Presidents
0
474389
4669576
4669488
2026-09-10T12:53:53Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-48940-54|~2026-48940-54]] ([[User talk:~2026-48940-54|talk]]) to last version by MarcGarver
4533973
wikitext
text/x-wiki
==Table of Contents==
*{{page|Introduction|100%}}
*{{page|The White House|0%}}
==The 18th Century==
* {{page|George Washington|75%}}
* {{page|John Adams|0%}}
==The 19th Century==
* {{page|Thomas Jefferson|0%}}
* {{page|James Madison|0%}}
* {{page|James Monroe|0%}}
* {{page|John Quincy Adams|0%}}
* {{page|Andrew Jackson|0%}}
* {{page|Martin Van Buren|0%}}
* {{page|William Henry Harrison|0%}}
* {{page|John Tyler|0%}}
* {{page|James K. Polk|0%}}
* {{page|Zachary Taylor|0%}}
* {{page|Millard Fillmore|0%}}
* {{page|Franklin Pierce|0%}}
* {{page|James Buchanan|0%}}
* {{page|Abraham Lincoln|0%}}
* {{page|Andrew Johnson|0%}}
* {{page|Ulysses S. Grant|0%}}
* {{page|Rutherford B. Hayes|0%}}
* {{page|James A. Garfield|0%}}
* {{page|Chester A. Arthur|0%}}
* {{page|Grover Cleveland|0%}}
* {{page|Benjamin Harrison|0%}}
* {{page|William McKinley|0%}}
==The 20th Century==
* {{page|Theodore Roosevelt|0%}}
* {{page|William Howard Taft|0%}}
* {{page|Woodrow Wilson|0%}}
* {{page|Warren G. Harding|0%}}
* {{page|Calvin Coolidge|0%}}
* {{page|Herbert Hoover|0%}}
* {{page|Franklin D. Roosevelt|0%}}
* {{page|Harry S. Truman|0%}}
* {{page|Dwight D. Eisenhower|0%}}
* {{page|John F. Kennedy|0%}}
* {{page|Lyndon B. Johnson|0%}}
* {{page|Richard Nixon|0%}}
* {{page|Gerald Ford|0%}}
* {{page|Jimmy Carter|0%}}
* {{page|Ronald Reagan|0%}}
* {{page|George H. W. Bush|0%}}
* {{page|Bill Clinton|0%}}
==The 21st Century==
* {{page|George W. Bush|0%}}
* {{page|Barack Obama|0%}}
* {{page|Donald Trump|0%}}
* {{page|Joe Biden|0%}}
{{alphabetical|U}}
{{status|0%}}
{{shelves|History}}
gtn2rr9f4o16vywxaspg987joeq6se0
User:JustTheFacts33/sandbox2
2
474624
4669627
4669470
2026-09-10T21:52:25Z
JustTheFacts33
3434282
/* Current production facilities */
4669627
wikitext
text/x-wiki
{{user sandbox}}
{{tmbox|type=notice|text=This is a sandbox page, a place for experimenting with Wikibooks.}}
The following is a list of current, former, and confirmed future facilities of [[w:Ford Motor Company|Ford Motor Company]] for manufacturing automobiles and other components. Per regulations, the factory is encoded into each vehicle's [[w:VIN|VIN]] as character 11 for North American models. European models have the factory encoded into each vehicle's [[w:VIN|VIN]] as character 8 (except for the VW-built 3rd gen. Ford Tourneo Connect and Transit Connect, which have the plant code in position 11 as VW does for all of its models regardless of region).
The River Rouge Complex manufactured most of the components of Ford vehicles, starting with the Model T. Much of the production was devoted to compiling "[[w:knock-down kit|knock-down kit]]s" that were then shipped in wooden crates to Branch Assembly locations across the United States by railroad and assembled locally, using local supplies as necessary.<ref name="MyLifeandWork">{{cite book|last=Ford|first=Henry|last2=Crowther|first2=Samuel|year=1922|title=My Life and Work|publisher=Garden City Publishing|pages=[https://archive.org/details/bub_gb_4K82efXzn10C/page/n87 81], 167|url=https://archive.org/details/bub_gb_4K82efXzn10C|quote=Ford 1922 My Life and Work|access-date=2010-06-08 }}</ref> A few of the original Branch Assembly locations still remain while most have been repurposed or have been demolished and the land reused. Knock-down kits were also shipped internationally until the River Rouge approach was duplicated in Europe and Asia.
For US-built models, Ford switched from 2-letter plant codes to a 1-letter plant code in 1953. Mercury and Lincoln, however, kept using the 2-letter plant codes through 1957. Mercury and Lincoln switched to the 1-letter plant codes for 1958. Edsel, which was new for 1958, used the 1-letter plant codes from the outset. The 1956-1957 Continental Mark II, a product of the Continental Division, did not use a plant code as they were all built in the same plant.
The 2-letter plant code in 1950-1952 Ford cars and 1950-1957 Mercurys and Lincolns was in position 3 & 4 of the serial number. The 1-letter plant code in 1953-1959 Ford cars, including the Ford Ranchero, and 1958-1959 Mercurys, Lincolns, and Edsels was in position 3 of the serial number. The 1-letter plant code in 1960-1980 Ford cars, including the Ford Ranchero, 1960-1980 Mercurys & Lincolns, and 1960 Edsels was in position 2 of the serial number. The 2-letter plant code in 1951-1952 Ford trucks was in position 5 & 6 of the serial number. The 1-letter plant code in 1953-1960 Ford trucks was in position 6 of the serial number. The 1-letter plant code in 1961-1980 Ford trucks, including Bronco and Econoline, was in position 5 of the serial number.
Canadian-built models used a different system for VINs until 1966, when Ford of Canada adopted the same system as the US. In 1950-1959, Canadian-built cars, including the Ford Ranchero, had a plant code in the 5th position of the serial number. In 1948-1950, Canadian-built Ford and Mercury trucks had a plant code in the 5th position of the serial number. In 1951-1954, Canadian-built Ford and Mercury trucks had a plant code in the 7th position of the serial number. In 1955-1959, Canadian-built Ford and Mercury trucks had a plant code in the 9th position of the serial number.
Mexican-built models often just had "MEX" inserted into the VIN instead of a plant code in the pre-standardized VIN era.
European-built Fords have the source company code in the 7th position and the plant code in the 8th position beginning in 1981. From 1965-1980, the source company code was in the 1st position and the plant code was in the 2nd position. Since the letter for the plant code is sometimes used by more than one plant, the source company code immediately preceding the plant code is needed to determine which plant is being referred to.
For a listing of Ford's proving grounds and test facilities see [[w:Ford Proving Grounds|Ford Proving Grounds]].
==Current production facilities==
{| class="wikitable sortable" style="font-size:90%"
|-
! style="width:120px;"| VIN
! style="width:200px;"| Name
! style="width:100px;"| City/state
! style="width:100px;"| Country
! data-sort-type="isoDate" style="width:60px;" | Opened
! data-sort-type="number" style="width:80px;" | Employees
! style="width:220px;"| Products
! style="width:350px;" class="unsortable"| Comments
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:AutoAlliance Thailand|AutoAlliance Thailand]]
| style="text-align:left;"| [[w:Pluak Daeng district|Pluak Daeng district]], [[w:Rayong|Rayong]]
| style="text-align:left;"| [[w:Thailand|Thailand]]
| style="text-align:center;"| 1998
| style="text-align:right;"| 5,400
| style="text-align:left;"| [[w:Ford Ranger (T6)|Ford Ranger (T6)]]<br /> [[w:Ford Everest|Ford Everest]]<br /> [[w:Mazda 2|Mazda 2]]<br >[[w:Mazda 3|Mazda 3]]<br >[[w:Mazda CX-3|Mazda CX-3]]<br />[[w:Mazda CX-30|Mazda CX-30]]
| Joint venture 50% owned by Ford and 50% owned by Mazda. <br />Previously: [[w:Ford Ranger (international)#First generation (PE/PG/PH; 1998)|Ford Ranger (PE/PG/PH)]]<br />[[w:Ford Ranger (international)#Second generation (PJ/PK; 2006)|Ford Ranger (PJ/PK)]]<br /> [[w:Ford Fiesta (sixth generation)|Ford Fiesta]]<br />[[w:Ford Laser|Ford Laser]]<br /> [[w:Mazda Familia#Ninth generation (BJ; 1998–2003)|Mazda Protege]]<br />[[w:Mazda B series#UN|Mazda B-Series]]<br >[[w:Mazda BT-50#First generation (UN; 2006)|Mazda BT-50 (UN)]] <br >[[w:Mazda BT-50#Second generation (UP, UR; 2011)|Mazda BT-50 (T6)]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Buffalo Stamping|Buffalo Stamping]]
| style="text-align:left;"| [[w:Hamburg, New York|Hamburg, New York]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1950
| style="text-align:right;"| 843
| style="text-align:left;"| Body panels: Quarter Panels, Body Sides, Rear Floor Pan, Rear Doors, Roofs, front doors, hoods
| Located at 3663 Lake Shore Rd.
|- style="vertical-align:top;"
| style="text-align:center;"| A (NA)
| style="text-align:left;"| [[w:Changan Ford|Changan Ford]] Chongqing Assembly
| style="text-align:left;"| [[w:Chongqing|Chongqing]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| 2004 (Plant 1) <br /> 2012 (Plant 2) <br /> 2014 (Plant 3)
| style="text-align:right;"| 5,000+
| style="text-align:left;"| [[w:Ford Escape#fourth|Ford Escape]] <br />[[w:Ford Mondeo Sport|Ford Mondeo Sport]]<br /> [[w:Ford Mondeo|Ford Mondeo]]<br />[[w:Lincoln Corsair|Lincoln Corsair]] (US: '27-)<br />[[w:Lincoln Zephyr (China)|Lincoln Zephyr/Z]]
| style="text-align:left;"| Joint Venture: Chongqing Changan Automobile Co., Ltd. (50%), Ford Motor Company (50%). <br />Complex includes three assembly plants. <br /> Previously: [[w:Ford EcoSport#Second generation (B515; 2012)|Ford EcoSport]]<br />[[w:Ford Escort (China)|Ford Escort]]<br />[[w:Ford Evos|Ford Evos]]<br />[[w:Ford Fiesta (fourth generation)|Ford Fiesta (Gen 4)]]<br />[[w:Ford Fiesta (fifth generation)|Ford Fiesta (Gen 5)]]<br />[[w:Ford Focus|Ford Focus]]<br />[[w:Ford Kuga#third|Ford Kuga]]<br />[[w:Ford Mustang Mach-E|Ford Mustang Mach-E]]<br /> [[w:Ford S-Max#First generation (2006)|Ford S-Max]]<br />[[w:Mazda3#First generation (BK; 2003)|Mazda 3]]<br />[[w:Volvo S40#Second generation (2004–2012)|Volvo S40]]<br />[[w:Volvo S80#S80L|Volvo S80L]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Changan Ford|Changan Ford]] Chongqing Engine
| style="text-align:left;"| [[w:Chongqing|Chongqing]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| 2013
| style="text-align:right;"| 1,310
| style="text-align:left;"| [[w:Ford EcoBoost engine#1.0 L Fox|Ford 1.0 L Ecoboost I3 engine]]<br />[[w:Ford Sigma engine|Ford 1.5 L Sigma I4 engine]]<br />[[w:Ford EcoBoost engine#Inline four-cylinder|Ford 1.5 L EcoBoost I4 engine]]<br />
| style="text-align:left;"| Joint Venture: Chongqing Changan Automobile Co., Ltd. (50%), Ford Motor Company (50%).
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Changan Ford|Changan Ford]] Chongqing Transmission
| style="text-align:left;"| [[w:Chongqing|Chongqing]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| 2014
| style="text-align:right;"| 1,480
| style="text-align:left;"| [[w:Ford 6F transmission|Ford 6F15 transmission]]<br />[[w:Ford 6F transmission|Ford 6F35 transmission]]<br />
| style="text-align:left;"| Joint Venture: Chongqing Changan Automobile Co., Ltd. (50%), Ford Motor Company (50%).
|- style="vertical-align:top;"
| style="text-align:center;"| J (NA)
| style="text-align:left;"| [[w:Changan Ford|Changan Ford]] Hangzhou Assembly
| style="text-align:left;"| [[w:Hangzhou|Hangzhou]], [[w:Zhejiang|Zhejiang]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| 2015
| style="text-align:right;"|
| style="text-align:left;"| [[w:Ford Edge#Third generation (Edge L—CDX706; 2023)|Ford Edge L]]<br />[[w:Ford Explorer#Sixth generation (U625; 2020)|Ford Explorer]] <br />[[w:Lincoln Aviator#Second generation (U611; 2020)|Lincoln Aviator]]<br />[[w:Lincoln Nautilus|Lincoln Nautilus]] (US: '24-)
| style="text-align:left;"| Joint Venture: Chongqing Changan Automobile Co., Ltd. (50%), Ford Motor Company (50%). <br /> Previously: [[w:Ford Edge#Second generation (CD539; 2015)|Ford Edge Plus]]<br />[[w:Ford Taurus (China)|Ford Taurus]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Changan Ford|Changan Ford]] <br> Harbin Assembly
| style="text-align:left;"| [[w:Harbin|Harbin]], [[w:Heilongjiang|Heilongjiang]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| 2016 (Start of Ford production)
| style="text-align:right;"|
| style="text-align:left;"| Production suspended in Nov. 2019
| style="text-align:left;"| Plant formerly belonged to Harbin Hafei Automobile Group Co. Bought by Changan Ford in 2015. Joint Venture: Chongqing Changan Automobile Co., Ltd. (50%), Ford Motor Company (50%). <br /> Previously: [[w:Ford Focus (third generation)|Ford Focus]] (Gen 3)<br>[[w:Ford Focus (fourth generation)|Ford Focus]] (Gen 4)
|- style="vertical-align:top;"
| style="text-align:center;"| CHI/CH/G (NA)
| style="text-align:left;"| [[w:Chicago Assembly|Chicago Assembly]]
| style="text-align:left;"| [[w:Chicago|Chicago]], [[w:Illinois|Illinois]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1924
| style="text-align:right;"| 4,852
| style="text-align:left;"| [[w:Ford Explorer#Sixth generation (U625; 2020)|Ford Explorer (U625)]] (2020-)<br />[[w:Lincoln Aviator#Second generation (U611; 2020)|Lincoln Aviator (U611)]] (2020-)
| style="text-align:left;"| Located at 12600 S Torrence Avenue.<br/>Replaced the previous location at 3915 Wabash Avenue.<br /> Built armored personnel carriers for US military during WWII. <br /> Final Taurus rolled off the assembly line March 1, 2019.<br />Previously: <br /> [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:Ford Model 48|Ford Model 48]]<br />[[w:1937 Ford|1937 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />[[w:1949 Ford|1949 Ford]]<br />[[w:1952 Ford|1952 Ford]]<br />[[w:1955 Ford|1955 Ford]]<br />[[w:1957 Ford|1957 Ford]]<br />[[w:Ford F-Series|Ford F-Series]] (1953-1964) <br /> [[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1965)<br />[[w:Ford Galaxie|Ford Galaxie]] (1959-1973)<br />[[w:Ford LTD (Americas)|Ford LTD (full-size)]] (1968, 1970-1972, 1974)<br />[[w:Ford Torino|Ford Torino]] (1974-1976)<br />[[w:Ford Elite|Ford Elite]] (1974-1976)<br /> [[w:Ford Thunderbird|Ford Thunderbird]] (1977-1980)<br />[[w:Ford Granada (North America)#Second generation (1981–1982)|Ford Granada]] (1981-1982)<br />[[w:Mercury Cougar#Fifth generation (1980–1982)|Mercury Cougar]] (non-XR-7 models only) (1981-1982)<br />[[w:Ford LTD (Americas)#Fourth generation (1983–1986)|Ford LTD (midsize)]] (1983-1986)<br />[[w:Mercury Marquis#Fourth generation (1983–1986)|Mercury Marquis]] (1983-1986)<br />[[w:Ford Taurus|Ford Taurus]] (1986–2019)<br />[[w:Mercury Sable|Mercury Sable]] (1986–2005, 2008-2009)<br />[[w:Ford Five Hundred|Ford Five Hundred]] (2005-2007)<br />[[w:Mercury Montego#Third generation (2005–2007)|Mercury Montego]] (2005-2007)<br />[[w:Lincoln MKS|Lincoln MKS]] (2009-2016)<br />[[w:Ford Freestyle|Ford Freestyle]] (2005-2007)<br />[[w:Ford Taurus X|Ford Taurus X]] (2008-2009)<br />[[w:Ford Explorer#Fifth generation (U502; 2011)|Ford Explorer (U502)]] (2011-2019)
|- style="vertical-align:top;"
|
| style="text-align:left;"| Chicago Stamping
| style="text-align:left;"| [[w:Chicago Heights, Illinois|Chicago Heights, Illinois]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1956
| style="text-align:right;"| 1,165
|
| Located at 1000 E Lincoln Hwy, Chicago Heights, IL
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Chihuahua Engine|Chihuahua Engine]]
| style="text-align:left;"| [[w:Chihuahua, Chihuahua|Chihuahua, Chihuahua]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| 1983
| style="text-align:right;"| 2,430
| style="text-align:left;"| [[w:Mazda L engine|Ford Duratec 2.0/2.3/2.5 I4]] <br />[[w:Ford EcoBoost engine#1.5 L Dragon|Ford 1.5L Dragon EcoBoost I3]] <br /> [[w:Ford Power Stroke engine#6.7 Power Stroke|Ford 6.7L Scorpion Diesel V8]]
| style="text-align:left;"| Began operations July 27, 1983. 1,902,600 Penta engines produced from 1983-1991. 2,340,464 Zeta engines produced from 1993-2004. Over 14 million total engines produced. Complex includes 3 engine plants. Plant 1, opened in 1983, builds 4-cylinder engines. Plant 2, opened in 2010, builds diesel V8 engines. Plant 3, opened in 2018, builds the Dragon 3-cylinder. <br /> Previously: [[w:Ford HSC engine|Ford HSC/Penta engine]]<br />[[w:Ford Zeta engine|Ford Zeta engine]]<br />[[w:Ford 4.4 Turbo Diesel|4.4L Diesel V8]] (for Land Rover)
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Cleveland Engine|Cleveland Engine]] #1
| style="text-align:left;"| [[w:Brook Park, Ohio|Brook Park, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1951
| style="text-align:right;"| 1,834
| style="text-align:left;"| [[w:Ford EcoBoost engine#2.0 L (2010–2015)|Ford 2.0/2.3 EcoBoost I4]]<br /> [[w:Ford EcoBoost engine#3.5 L (first generation)|Ford 3.5 L EcoBoost V6]]<br />[[w:Ford Cyclone engine|Ford 3.5/3.7 Cyclone V6 (for RWD vehicles)]]
| style="text-align:left;"| Located at 17601 Brookpark Rd. Idled from May 2007 to May 2009.<br />Previously: [[w:Lincoln Y-block V8 engine|Lincoln Y-block V8 engine]]<br />[[w:Ford small block engine|Ford 221/260/289/302 Windsor V8]]<br />[[w:Ford Duratec V6 engine#3.0 L|Ford 3.0L Duratec V6]]
|- style="vertical-align:top;"
| style="text-align:center;"| A (EU) [when following G] [includes Mercury Capri] /<br> E (NA) <br> [Merkur Scorpio]
| style="text-align:left;"| [[w:Cologne Body & Assembly|Cologne Body & Assembly]]
| style="text-align:left;"| [[w:Cologne|Cologne]], [[w:North Rhine-Westphalia|North Rhine-Westphalia]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| 1931
| style="text-align:right;"| 4,090
| style="text-align:left;"| [[w:Ford Explorer EV|Ford Explorer EV]] (VW MEB-based) <br /> [[w:Ford Capri EV|Ford Capri EV]] (VW MEB-based)
| Previously: [[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:Ford Model B (1932)|Ford Model B]]<br />[[w:Ford Rheinland|Ford Rheinland]]<br />[[w:Ford Köln|Ford Köln]]<br />[[w:Ford Eifel|Ford Eifel]]<br />[[w:Ford Taunus|Ford Taunus]]<br /> [[w:Ford Transit#Taunus Transit (1953)|Ford Taunus Transit]]<br />[[w:Ford Capri|Ford Capri]]<br />[[w:Mercury Capri#First generation (1970–1978)|Mercury Capri]] (1970-1974, 1976-1977)<br />[[w:Ford Consul#Ford Consul (Granada Mark I based) (1972–1975)|Ford Consul]]<br />[[w:Ford Granada (Europe)|Ford Granada]]<br />[[w:Ford Sierra|Ford Sierra]]<br />[[w:Ford Mondeo (first generation)|Ford Mondeo]]<br />[[w:Ford Scorpio|Ford Scorpio]]<br />[[w:Merkur Scorpio|Merkur Scorpio]] (1988-1989)<br />[[w:Ford Fiesta|Ford Fiesta]] <br /> [[w:Ford Fusion (Europe)|Ford Fusion]]<br />[[w:Ford Puma (sport compact)|Ford Puma]]<br />[[w:Ford Courier#Europe (1991–2002)|Ford Courier]]<br />[[w:de:Ford Modell V8-51|Ford Model V8-51]]<br />[[w:de:Ford V-3000-Serie|Ford V-3000/Ford B 3000 series]]<br />[[w:Ford Rhein|Ford Rhein]]<br />[[w:Ford Ruhr|Ford Ruhr]]<br />[[w:Ford FK|Ford FK]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Cologne Engine
| style="text-align:left;"| [[w:Cologne|Cologne]], [[w:North Rhine-Westphalia|North Rhine-Westphalia]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| 1962
| style="text-align:right;"| 810
| style="text-align:left;"| [[w:Ford EcoBoost engine#1.0 L Fox|1.0 litre EcoBoost I3]] <br /> [[w:Aston Martin V12 engine|Aston Martin V12 engine]]
| style="text-align:left;"| Aston Martin engines are built at the [[w:Aston Martin Engine Plant|Aston Martin Engine Plant]], a special section of the plant which is separated from the rest of the plant.<br> Previously: <br /> [[w:Ford Taunus V4 engine|Ford Taunus V4 engine]]<br />[[w:Ford Cologne V6 engine|Ford Cologne V6 engine]]<br />[[w:Jaguar AJ-V8 engine#Aston Martin 4.3/4.7|Aston Martin 4.3/4.7 V8]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Cologne Tool & Die
| style="text-align:left;"| [[w:Cologne|Cologne]], [[w:North Rhine-Westphalia|North Rhine-Westphalia]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| 1963
| style="text-align:right;"| 1,140
| style="text-align:left;"| Tooling, dies, fixtures, jigs, die repair
|
|- style="vertical-align:top;"
|
| style="text-align:left;"| Cologne Transmission
| style="text-align:left;"| [[w:Cologne|Cologne]], [[w:North Rhine-Westphalia|North Rhine-Westphalia]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| 1935
| style="text-align:right;"| 1,280
| style="text-align:left;"| [[w:Ford MTX-75 transmission|Ford MTX-75 transmission]]<br /> [[w:Ford MTX-75 transmission|Ford VXT-75 transmission]]<br />Ford VMT6 transmission<br />[[w:Volvo Cars#Manual transmissions|Volvo M56/M58/M66 transmission]]<br />Ford MMT6 transmission
| Formerly part of the [[w:Getrag Ford Transmission|Getrag Ford Transmission]] joint venture. Returned to 100% Ford ownership in 2021.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Cortako Cologne GmbH
| style="text-align:left;"| [[w:Cologne|Cologne]], [[w:North Rhine-Westphalia|North Rhine-Westphalia]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| 1961
| style="text-align:right;"| 410
| style="text-align:left;"| Forging of steel parts for engines, transmissions, and chassis
| Originally known as Cologne Forge & Die Cast Plant. Previously known as Tekfor Cologne GmbH from 2003 to 2011, a 50/50 joint venture between Ford and Neumayer Tekfor GmbH. Also briefly known as Cologne Precision Forge GmbH. Bought back by Ford in 2011 and now 100% owned by Ford.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Coscharis Motors Assembly Ltd.
| style="text-align:left;"| [[w:Lagos|Lagos]]
| style="text-align:left;"| [[w:Nigeria|Nigeria]]
| style="text-align:center;"|
| style="text-align:right;"|
| style="text-align:left;"| [[w:Ford Ranger (T6)|Ford Ranger]]
| style="text-align:left;"| Plant owned by Coscharis Motors Assembly Ltd. Built under contract for Ford.
|- style="vertical-align:top;"
| style="text-align:center;"| M (NA)
| style="text-align:left;"| [[w:Cuautitlán Assembly|Cuautitlán Assembly]]
| style="text-align:left;"| [[w:Cuautitlán Izcalli|Cuautitlán Izcalli]], [[w:Mexico State|Mexico State]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| 1964
| style="text-align:right;"| 1,000
| style="text-align:left;"| [[w:Ford Mustang Mach-E|Ford Mustang Mach-E]] (2021-)
| Truck assembly began in 1970 while car production began in 1980. <br /> Previously made:<br /> [[w:Ford F-Series|Ford F-Series]] (1992-2010) <br> (US: F-250 '97, F-350 '97,<br> F-Super Duty chassis cab '97,<br> F-150 Reg. Cab '00-'02,<br> Mexico: includes F-150 & Lobo)<br />[[w:Ford F-Series (medium-duty truck)#Sixth generation (1980–1999)|Ford F-800]] (US: 1999) <br />[[w:Ford F-Series (medium-duty truck)#Seventh generation (2000–2015)|Ford F-650/F-750]] (2000-2003) <br /> [[w:Ford Fiesta (sixth generation)|Ford Fiesta]] (2011-2019)<br />[[w:Ford Contour|Ford Contour]] (1995-2000)<br />[[w:Mercury Mystique|Mercury Mystique]] (1995-2000)<br />For Mexico only:<br>[[w:Ford Ikon#First generation (1999–2011)|Ford Fiesta Ikon]] (2001-2009)<br />[[w:Ford Topaz|Ford Topaz]]<br />[[w:Mercury Topaz|Ford Ghia]]<br />[[w:Ford LTD (Americas)#Third generation (1979–1982)|Ford LTD]] (Mexico: 1980-1981)<br />[[w:Ford Grand Marquis|Ford Grand Marquis]] (Mexico: 1982-84)<br />[[w:Mercury Sable|Ford Taurus]]<br />[[w:Ford Thunderbird|Ford Thunderbird]]<br />[[w:Mercury Cougar|Ford Cougar]]<br />[[w:Ford Mustang (third generation)|Ford Mustang]] Gen 3 (1979-1984)
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Dagenham|Dagenham Engine]]
| style="text-align:left;"| [[w:Dagenham|Dagenham]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| 1931
| style="text-align:right;"| 2,000
| style="text-align:left;"| [[w:Ford EcoBlue engine|Ford EcoBlue 1.5/2.0 Diesel I4 engine]] (Panther)<br /> [[w:Ford AJD-V6/PSA DT17#Lion V6|Ford 2.7/3.0 Lion Diesel V6]]
|Previously: [[w:Ford I4 DOHC engine|Ford I4 DOHC engine]]<br />[[w:Ford Endura-D engine|Ford Endura-D engine]] (Lynx)<br />[[w:Ford Duratorq engine#ZSD ("Puma")|Ford Puma I4 diesel engine]]<br />[[w:Ford Essex V4 engine|Ford Essex V4 engine]]<br />[[w:Ford Essex V6 engine (UK)|Ford Essex V6 engine (UK)]]<br />[[w:Ford LT engine|Ford LT engine]]<br />[[w:Ford York engine|Ford York engine]]<br />[[w:Ford Dorset/Dover engine|Ford Dorset/Dover engine]] <br /> [[w:Ford AJD-V6/PSA DT17#Lion V8|Ford 3.6L Diesel V8]] <br /> [[w:Ford DLD engine|Ford DLD engine]] (Tiger)
|- style="vertical-align:top;"
| style="text-align:center;"| W (NA)
| style="text-align:left;"| [[w:Ford River Rouge Complex|Ford Rouge Electric Vehicle Center]]
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 2021
| style="text-align:right;"| 2,200
| style="text-align:left;"|
| style="text-align:left;"| Part of the River Rouge Complex. <br> Previously: [[w:Ford F-150 Lightning|Ford F-150 Lightning EV]] (2022-2025)
|- style="vertical-align:top;"
|
| style="text-align:left;"| Dearborn Diversified Manufacturing Plant
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1942
| style="text-align:right;"| 773
| style="text-align:left;"| Axles, suspension parts. Frames for F-Series trucks.
| style="text-align:left;"| Part of the River Rouge Complex.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford River Rouge Complex|Dearborn Engine]]
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1941
| style="text-align:right;"| 445
| style="text-align:left;"| [[w:Mazda L engine#2.0 L (LF-DE, LF-VE, LF-VD)|Ford Duratec 20]]<br />[[w:Mazda L engine#2.3L (L3-VE, L3-NS, L3-DE)|Ford Duratec 23]]<br />[[w:Mazda L engine#2.5 L (L5-VE)|Ford Duratec 25]] <br />[[w:Ford Modular engine#Carnivore|Ford 5.2L Carnivore V8]] <br>(F-150 Raptor R)<br />[[w:Ford Modular engine#Predator|Ford 5.2L Predator V8]] (Mustang GTD,<br> Dark Horse SC)<br />Engine components
| style="text-align:left;"| Part of the River Rouge Complex. Carnivore & Predator engines are produced on a new Niche Engine line at the Dearborn Engine Plant which replaced the Niche Engine line at the now closed Romeo Engine Plant. <br /> Previously: [[w:Ford FE engine|Ford FE engine]]<br />[[w:Ford CVH engine|Ford CVH engine]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford River Rouge Complex|Dearborn Stamping]]
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1939
| style="text-align:right;"|1,658
| style="text-align:left;"| Body stampings
| Part of the River Rouge Complex.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Dearborn Tool & Die
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1938
| style="text-align:right;"| 271
| style="text-align:left;"| Tooling
| style="text-align:left;"| Part of the River Rouge Complex.
|- style="vertical-align:top;"
| style="text-align:center;"| F (NA)
| style="text-align:left;"| [[w:Dearborn Truck|Dearborn Truck]]
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 2004
| style="text-align:right;"| 6,131
| style="text-align:left;"| [[w:Ford F-Series (fourteenth generation)|Ford F-150]] (2021-)
| style="text-align:left;"| Part of the River Rouge Complex. Located at 3001 Miller Rd. Replaced the nearby Dearborn Assembly Plant for MY2005. Built the 40 millionth Ford <br> F-Series in Jan. 2022, which was an <br> F-150 Tremor.<br />Previously: <br />[[w:Ford F-Series (eleventh generation)|Ford F-Series (eleventh generation)]] (2005-2008 F-150)<br />[[w:Ford F-Series (twelfth generation)|Ford F-Series (twelfth generation)]] (2009-2014 F-150)<br />[[w:Ford F-Series (thirteenth generation)|Ford F-Series (thirteenth generation)]] (2015-2020 F-150)<br />[[w:Lincoln Mark LT|Lincoln Mark LT]] (2006-2008)
|- style="vertical-align:top;"
| style="text-align:center;"| 0 (NA)
| style="text-align:left;"| Detroit Chassis LLC
| style="text-align:left;"| [[w:Detroit, Michigan|Detroit, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 2000
|
| style="text-align:left;"| Ford F-53 Motorhome Chassis (2000-)<br/>Ford F-59 Commercial Chassis (2000-)
| Located at 6501 Lynch Rd. Replaced production at IMMSA in Mexico. Plant owned by Detroit Chassis LLC. Produced under contract for Ford. <br /> Previously: [[w:Think Global#TH!NK Neighbor|Ford TH!NK Neighbor]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Essex Engine|Essex Engine]]
| style="text-align:left;"| [[w:Windsor, Ontario|Windsor, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| 1981
| style="text-align:right;"| 930
| style="text-align:left;"| [[w:Ford Modular engine#5.0 L Coyote|Ford 5.0L Coyote V8]]<br />[[w:Ford Godzilla engine|Ford 7.3L Godzilla V8]]<br>Engine components
| style="text-align:left;"|Idled in November 2007, reopened February 2010. Previously: <br />[[w:Ford Essex V6 engine (Canadian)|Ford Essex V6 engine (Canadian)]] 3.8/3.9/4.2L <br />[[w:Ford Modular engine|Ford 5.4L 3-valve Modular V8]]<br/>[[w:Ford Modular engine# Boss 302 (Road Runner) variant|Ford 5.0L Road Runner V8]]
|- style="vertical-align:top;"
| style="text-align:center;"| 5 (NA)
| style="text-align:left;"| [[w:Flat Rock Assembly Plant|Flat Rock Assembly Plant]]
| style="text-align:left;"| [[w:Flat Rock, Michigan|Flat Rock, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1987
| style="text-align:right;"| 1,826
| style="text-align:left;"| [[w:Ford Mustang (seventh generation)|Ford Mustang (Gen 7)]] (2024-)
| style="text-align:left;"| Built at site of closed Ford Michigan Casting Center (1972-1981) , which cast various parts for Ford including V8 engine blocks and heads for Ford [[w:Ford 335 engine|335]], [[w:Ford 385 engine|385]], & [[w:Ford FE engine|FE/FT series]] engines as well as transmission, axle, & steering gear housings and gear cases. Opened as a Mazda plant (Mazda Motor Manufacturing USA) in 1987. Became AutoAlliance International from 1992 to 2012 after Ford bought 50% of the plant from Mazda. Became Flat Rock Assembly Plant in 2012 when Mazda ended production and Ford took full management control of the plant. <br /> Previously: <br />[[w:Ford Mustang (sixth generation)|Ford Mustang (Gen 6)]] (2015-2023)<br /> [[w:Ford Mustang (fifth generation)|Ford Mustang (Gen 5)]] (2005-2014)<br /> [[w:Lincoln Continental#Tenth generation (2017–2020)|Lincoln Continental]] (2017-2020)<br />[[w:Ford Fusion (Americas)|Ford Fusion]] (2014-2016)<br />[[w:Mercury Cougar#Eighth generation (1999–2002)|Mercury Cougar]] (1999-2002)<br />[[w:Ford Probe|Ford Probe]] (1989-1997)<br />[[w:Mazda 6|Mazda 6]] (2003-2013)<br />[[w:Mazda 626|Mazda 626]] (1990-2002)<br />[[w:Mazda MX-6|Mazda MX-6]] (1988-1997)
|- style="vertical-align:top;"
| style="text-align:center;"| 2 (NA)
| style="text-align:left;"| [[w:Ford Lio Ho|Ford Lio Ho Assembly]]
| style="text-align:left;"| [[w:Zhongli District|Zhongli District]], [[w:Taoyuan, Taiwan|Taoyuan]]
| style="text-align:left;"| [[w:Taiwan|Taiwan]]
| style="text-align:center;"| 1973
| style="text-align:right;"| 800
| style="text-align:left;"| [[w:Ford Focus|Ford Focus]]<br /> Ford Focus Active <br /> [[w:Ford Kuga|Ford Kuga]]<br /> [[w:Ford Territory (China)#Second generation (CX743MCA; 2022)|Ford Territory]]
| Joint venture 70% owned by Ford and 30% owned by Lio Ho Group. <br /> Previously: [[w:Ford Laser#Ford Tierra|Ford Activa]]<br />[[w:Ford Aztec|Ford Aztec]]<br />[[w:Ford Cortina|Ford Cortina]]<br />[[w:Ford Econovan|Ford Econovan]]<br />[[w:Ford Escape|Ford Escape]]<br />[[w:Ford Escort (Europe)|Ford Escort (Europe)]]<br />[[w:Ford Escort (China)|Ford Escort (Chinese)]]<br />[[w:Ford Festiva|Ford Festiva]]<br />Ford Fiera<br />[[w:Ford Fiesta (sixth generation)|Ford Fiesta]]<br />[[w:Ford Granada (Europe)|Ford Granada]]<br />[[w:Ford Ixion|Ford Ixion]]<br />[[w:Ford i-Max|Ford i-Max]]<br />[[w:Ford Laser|Ford Laser]]<br />[[w:Ford Liata|Ford Liata]]<br />[[w:Ford Mondeo|Ford Mondeo]]<br />[[w:Ford Pronto|Ford Pronto]]<br />[[w:Ford Telstar|Ford Telstar]]<br />[[w:Ford Tierra|Ford Tierra]] <br /> [[w:Mercury Tracer#First generation (1987–1989)|Mercury Tracer]] (Canadian market)<br />[[w:Mazda 3|Mazda 3]]<br />[[w:Mazda Familia|Mazda 323 Protege]]<br />[[w:Mazda Premacy|Mazda Premacy]]<br />[[w:Mazda 5|Mazda 5]]<br />[[w:Mazda E-Series|Mazda E-Series]]<br />[[w:Mazda Tribute|Mazda Tribute]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Lio Ho|Ford Lio Ho Engine]]
| style="text-align:left;"| [[w:Zhongli District|Zhongli District]], [[w:Taoyuan, Taiwan|Taoyuan]]
| style="text-align:left;"| [[w:Taiwan|Taiwan]]
| style="text-align:center;"|
| style="text-align:right;"| 90
| style="text-align:left;"| [[w:Mazda L engine|Mazda L engine]] (1.8, 2.0, 2.3)
| Joint venture 70% owned by Ford and 30% owned by Lio Ho Group. <br /> Previously: <br /> [[w:Ford Zeta engine|Ford Zeta engine]]<br />[[w:Mazda Z engine#Z6/M|Mazda 1.6 ZM-DE I4]]<br />[[w:Mazda F engine|Mazda F engine]] (1.8, 2.0)<br /> [[w:Suzuki F engine#Four-cylinder|Suzuki 1.0 I4]] (for Ford Pronto)
|- style="vertical-align:top;"
| style="text-align:center;"| J (EU) [when following M] (for Ford),<br> S (for VW)
| style="text-align:left;"| [[w:Ford Motor Company of Southern Africa|Ford Motor Company of Southern Africa]] Silverton Assembly Plant
| style="text-align:left;"| [[w:Silverton, Pretoria|Silverton]]
| style="text-align:left;"| [[w:South Africa|South Africa]]
| style="text-align:center;"| 1967
| style="text-align:right;"| 4,650
| style="text-align:left;"| [[w:Ford Ranger (international)|Ford Ranger]]<br /> [[w:Ford Everest|Ford Everest]]<br />[[w:Volkswagen Amarok#Second generation (2022)|VW Amarok]]
| Silverton plant was originally a Chrysler of South Africa plant from 1961 to 1976. In 1976, it merged with a unit of mining company Anglo-American to form Sigma Motor Corp., which Chrysler retained 25% ownership of. Chrysler sold its 25% stake to Anglo-American in 1983. Sigma was restructured into Amcar Motor Holdings Ltd. in 1984. In 1985, Amcar merged with Ford South Africa to form SAMCOR (South African Motor Corporation). Sigma had already assembled Mazda & Mitsubishi vehicles previously and SAMCOR continued to do so. In 1988, Ford divested from South Africa & sold its stake in SAMCOR. SAMCOR continued to build Ford vehicles as well as Mazdas & Mitsubishis. In 1994, Ford bought a 45% stake in SAMCOR and it bought the remaining 55% in 1998. It then renamed the company Ford Motor Company of Southern Africa in 2000. <br /> Previously: [[w:Ford Laser#South Africa|Ford Laser]]<br />[[w:Ford Laser#South Africa|Ford Meteor]]<br />[[w:Ford Tonic|Ford Tonic]]<br />[[w:Ford_Laser#South_Africa|Ford Tracer]]<br />[[w:Mazda 323|Mazda 323]]<br />[[w:Mazda Familia|Mazda Etude]]<br />[[w:Mazda Familia#Export markets 2|Mazda Sting]]<br />[[w:Sao Penza|Sao Penza]]<br />[[w:Mazda Familia#Lantis/Astina/323F|Mazda 323 Astina]]<br />[[w:Ford Focus (second generation, Europe)|Ford Focus]]<br />[[w:Mazda 3|Mazda 3]]<br />[[w:Ford Bantam|Ford Bantam]]<br />[[w:Mazda Rustler|Mazda Rustler]]<br />[[w:Mitsubishi Delica#Second generation (1979)|Ford Husky]]<br />[[w:Mitsubishi Delica#Second generation (1979)|Mitsubishi Starwagon]]<br />[[w:Ford Fiesta (fourth generation)|Ford Fiesta]]<br />[[w:Ford Fiesta (fourth generation)#Mazda 121|Mazda 121 Soho]]<br />[[w:Ford Ikon#First generation (1999–2011)|Ford Ikon]]<br />[[w:Ford Sierra|Ford Sierra]]<br />[[w:Ford Sapphire|Ford Sapphire]]<br />[[w:Ford Telstar|Ford Telstar]]<br />[[w:Mazda 626|Mazda 626]]<br />[[w:Mazda MX-6|Mazda MX-6]]<br />[[w:Ford Mondeo (first generation)|Ford Mondeo]]<br />[[w:Ford Courier#Third generation (1985–1998)|Ford Courier]]<br />[[w:Mazda B-Series|Mazda B-Series]]<br />[[w:Mazda Drifter|Mazda Drifter]]<br />[[w:Mazda BT-50|Mazda BT-50]] Gen 1 & Gen 2<br />[[w:Ford Spectron|Ford Spectron]]<br />[[w:Mazda Bongo|Mazda Marathon]]<br /> [[w:Mitsubishi Fuso Canter#Fourth generation|Mitsubishi Canter]]<br />[[w:Land Rover Defender|Land Rover Defender]] <br/>[[w:Volvo S40|Volvo S40/V40]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Motor Company of Southern Africa|Ford Motor Company of Southern Africa]] Struandale Engine Plant
| style="text-align:left;"| Struandale, [[w:Port Elizabeth|Port Elizabeth]]
| style="text-align:left;"| [[w:South Africa|South Africa]]
| style="text-align:center;"| 1964
| style="text-align:right;"| 850
| style="text-align:left;"| [[w:Ford EcoBlue engine|Ford 2.0L Panther EcoBlue single-turbodiesel & twin-turbodiesel I4]]<br />[[w:Ford Power Stroke engine#3.0 Power Stroke|Ford 3.0 Lion turbodiesel V6]]<br />[[w:Ford Duratorq engine#ZSD ("Puma")|Ford 2.2/3.2 Puma diesel engine]]<br />Machining of engine components
| Previously: [[w:Ford Kent engine#Crossflow|Ford Kent Crossflow I4 engine]]<br />[[w:Ford CVH engine#CVH-PTE|Ford 1.4L CVH-PTE engine]]<br />[[w:Ford Zeta engine|Ford 1.6L EFI Zetec I4]]<br /> [[w:Ford Sigma engine#Zetec RoCam|Ford Zetec RoCam engine]]<br />[[w:Ford Essex V6 engine (UK)|Ford Essex V6 engine (UK)]]
|- style="vertical-align:top;"
| style="text-align:center;"|T (EU) [when following T],<br> T (NA) ('10-'13 Transit Connect)
| style="text-align:left;"| [[w:Otosan|Ford Otosan Assembly - Gölcük]]
| style="text-align:left;"| [[w:Gölcük, Kocaeli|Gölcük, Kocaeli]]
| style="text-align:left;"| [[w:Turkey|Turkey]]
| style="text-align:center;"| 2001
| style="text-align:right;"| 7,530
| style="text-align:left;"| [[w:Ford Transit#Fourth generation (2014)|Ford Transit]] (Gen 4)
| style="text-align:left;"| Ford Otosan is 41% owned by Ford, 41% owned by Koç Holding and 18% publicly traded in Turkey. Transit Connect started shipping to the US in fall of 2009. <br /> Previously: <br />[[w:Ford Transit#Third generation (2000)|Ford Transit]] (Gen 3)<br /> [[w:Ford Transit Connect#First generation (2002)|Ford Transit Connect]] (Gen 1)<br />[[w:Ford Transit Connect#First generation (2002)|Ford Tourneo Connect]] (Gen 1)<br /> [[w:Ford Transit Custom# First generation (2012)|Ford Transit Custom]] (Gen 1)<br />[[w:Ford Transit Custom# First generation (2012)|Ford Tourneo Custom]] (Gen 1)
|- style="vertical-align:top;"
| style="text-align:center;"| A (EU) [when following T] (for Ford),<br> K (for VW)
| style="text-align:left;"| [[w:Otosan|Ford Otosan Assembly - Yeniköy]]
| style="text-align:left;"| [[w:tr:Yeniköy Merkez, Başiskele|Yeniköy Merkez]], [[w:Başiskele|Başiskele]], [[w:Kocaeli Province|Kocaeli]]
| style="text-align:left;"| [[w:Turkey|Turkey]]
| style="text-align:center;"| 2014
| style="text-align:right;"|
| style="text-align:left;"| [[w:Ford Transit Custom#Second generation (2023)|Ford Transit Custom]] (Gen 2)<br /> [[w:Ford Transit Custom#Second generation (2023)|Ford Tourneo Custom]] (Gen 2) <br /> [[w:Volkswagen Transporter (T7)|Volkswagen Transporter/Caravelle (T7)]]
| style="text-align:left;"| Ford Otosan is 41% owned by Ford, 41% owned by Koç Holding and 18% publicly traded in Turkey. <br /> Previously: [[w:Ford Transit Courier#First generation (2014)| Ford Transit Courier]] (Gen 1) <br /> [[w:Ford Transit Courier#First generation (2014)|Ford Tourneo Courier]] (Gen 1)
|- style="vertical-align:top;"
|style="text-align:center;"| P (EU) [when following T]
| style="text-align:left;"| [[w:Otosan|Ford Otosan Truck Assembly & Engine Plant]]
| style="text-align:left;"| [[w:Inonu, Eskisehir|Inonu, Eskisehir]]
| style="text-align:left;"| [[w:Turkey|Turkey]]
| style="text-align:center;"| 1982
| style="text-align:right;"| 350
| style="text-align:left;"| [[w:Ford EcoBlue engine|Ford 2.0L "Panther" EcoBlue diesel I4]]<br /> [[w:Ford Cargo|Ford F-Line]] truck<br />[[w:Ford F-MAX|Ford F-MAX]]<br />[[w:Ford Ecotorq engine|Ford 9.0L/12.7L Ecotorq diesel I6]]<br />Ford EcoTorq transmission<br /> Rear Axle for Ford Transit
| Ford Otosan is 41% owned by Ford, 41% owned by Koç Holding and 18% publicly traded in Turkey. <br /> Previously: <br /> [[w:Ford D series|Ford D series]]<br /> [[w:Ford Cargo|Ford Cargo]] truck<br />[[w:Ford Zeta engine|Ford 1.6 Zetec I4]]<br />[[w:Ford York engine|Ford 2.5 DI diesel I4]]<br />[[w:Ford Duratorq engine#ZSD ("Puma")|Ford Puma I4/I5 diesel engine]]<br />[[w:Ford Dorset/Dover engine|Ford 6.0/6.2 diesel inline-6]]<br />[[w:Ford Ecotorq engine|7.3L Ecotorq diesel I6]]<br />[[w:Ford MT75 transmission|Ford MT75 transmission]] for Transit
|- style="vertical-align:top;"
| style="text-align:center;"| R (EU) [when following E]
| style="text-align:left;"| [[w:Ford Romania|Ford Romania/<br>Ford Otosan Romania]]<br> Craiova Assembly & Engine Plant
| style="text-align:left;"| [[w:Craiova|Craiova]]
| style="text-align:left;"| [[w:Romania|Romania]]
| style="text-align:center;"| 2009
| style="text-align:right;"| 4,000
| style="text-align:left;"| [[w:Ford Puma (crossover)|Ford Puma]] (2020-)<br />[[w:Ford Puma Gen-E|Ford Puma Gen-E]] EV (2025-)<br />[[w:Ford Transit Courier#Second generation (2023)|Ford Transit Courier/Tourneo Courier]] (Gen 2) (2023-)<br /> [[w:Ford EcoBoost engine#Inline three-cylinder|Ford 1.0 Fox EcoBoost I3]]
| Plant was originally Oltcit, a 64/36 joint venture between Romania and Citroen established in 1976. In 1991, Citroen withdrew and the car brand became Oltena while the company became Automobile Craiova. In 1994, it established a 49/51 joint venture with Daewoo called Rodae Automobile which was renamed Daewoo Automobile Romania in 1997. Engine and transmission plants were added in 1997. Following Daewoo’s collapse in 2000, the Romanian government bought out Daewoo’s 51% stake in 2006. Ford bought a 72.4% stake in Automobile Craiova in 2008, which was renamed Ford Romania. Ford increased its stake to 95.63% in 2009. In 2022, Ford transferred ownership of the Craiova plant to its Turkish joint venture Ford Otosan. <br /> Previously:<br> [[w:Ford Transit Connect#First generation (2002)|Ford Transit Connect]] (Gen 1) (2010-2012)<br /> [[w:Ford B-Max|Ford B-Max]] (2012-2017) <br /> [[w:Ford EcoSport#Second generation (B515; 2012)|Ford EcoSport]] (2018-2022) <br /> [[w:Ford EcoBoost engine#Inline four-cylinder|Ford 1.5 Sigma EcoBoost I4]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Thailand Manufacturing|Ford Thailand Manufacturing]]
| style="text-align:left;"| [[w:Pluak Daeng district|Pluak Daeng district]], [[w:Rayong|Rayong]]
| style="text-align:left;"| [[w:Thailand|Thailand]]
| style="text-align:center;"| 2012
| style="text-align:right;"| 3,000
| style="text-align:left;"| [[w:Ford Ranger (T6)|Ford Ranger (T6)]]
| Previously: [[w:Ford EcoSport#Second generation (B515; 2012)|Ford EcoSport]]<br /> [[w:Ford Focus (third generation)|Ford Focus]]<br /> [[w:Ford Fiesta (sixth generation)|Ford Fiesta]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Vietnam|Hai Duong Assembly, Ford Vietnam, Ltd.]]
| style="text-align:left;"| [[w:Hai Duong|Hai Duong]]
| style="text-align:left;"| [[w:Vietnam|Vietnam]]
| style="text-align:center;"| 1995
| style="text-align:right;"| 1,250
| style="text-align:left;"| [[w:Ford Transit#Transit T8 (2023-present)|Ford Transit]] (Gen 4-based)<br /> [[w:Ford Ranger (T6)|Ford Ranger (T6)]]<br /> [[w:Ford Territory (China)#Second generation (CX743MCA; 2022)|Ford Territory]]
| Joint venture 75% owned by Ford and 25% owned by Song Cong Diesel Company. <br />Previously: [[w:Ford Laser|Ford Laser]]<br />[[w:Ford Econovan|Ford Econovan]]<br /> [[w:Ford Tourneo|Ford Tourneo]]<br /> [[w:Ford Ranger (international)|Ford Ranger]]<br /> [[w:Ford Escape|Ford Escape]]<br /> [[w:Ford Mondeo|Ford Mondeo]]<br /> [[w:Ford Fiesta (sixth generation)|Ford Fiesta]]<br />[[w:Ford Focus|Ford Focus]]<br />[[w:Ford EcoSport#Second generation (B515; 2012)|Ford Ecosport]]<br />[[w:Ford Everest|Ford Everest]] <br /> [[w:Ford Transit#2021 Ford Transit Pro|Ford Transit]] (Gen 3-based)
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Halewood Transmission|Halewood Transmission]]
| style="text-align:left;"| [[w:Halewood|Halewood]], [[w:Merseyside|Merseyside]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| 1964
| style="text-align:right;"| 450
| style="text-align:left;"| [[w:Ford MT75 transmission|Ford MT75 transmission]]<br />Ford MT82 transmission<br /> [[w:Ford BC-series transmission#iB5 Version|Ford IB5 transmission]]<br />Ford iB6 transmission<br />PTO Transmissions
| Formerly part of the [[w:Getrag Ford Transmission|Getrag Ford Transmission]] joint venture. Returned to 100% Ford ownership in 2021.
|- style="vertical-align:top;"
| style="text-align:center;"| R (NA)
| style="text-align:left;"| [[w:Hermosillo Stamping and Assembly|Hermosillo Stamping and Assembly]]
| style="text-align:left;"| [[w:Hermosillo|Hermosillo]], [[w:Sonora|Sonora]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| 1986
| style="text-align:right;"| 2,870
| style="text-align:left;"| [[w:Ford Bronco Sport|Ford Bronco Sport]] (2021-)<br />[[w:Ford Maverick (2022)|Ford Maverick pickup]] (2022-)
| Hermosillo produced its 7 millionth vehicle, a blue Ford Bronco Sport, in June 2024.<br /> Previously: [[w:Ford Fusion (Americas)|Ford Fusion]] (2006-2020)<br />[[w:Mercury Milan|Mercury Milan]] (2006-2011)<br />[[w:Lincoln MKZ|Lincoln Zephyr]] (2006)<br />[[w:Lincoln MKZ|Lincoln MKZ]] (2007-2020)<br />[[w:Ford Focus (North America)|Ford Focus]] (hatchback) (2000-2005)<br />[[w:Ford Escort (North America)|Ford Escort]] (1991-2002)<br />[[w:Ford Escort (North America)#ZX2|Ford Escort ZX2]] (1998-2003)<br />[[w:Mercury Tracer|Mercury Tracer]] (1988-1999)
|- style="vertical-align:top;"
|
| style="text-align:left;"| Irapuato Electric Powertrain Center (formerly Irapuato Transmission Plant)
| style="text-align:left;"| [[w:Irapuato|Irapuato]], [[w:Guanajuato|Guanajuato]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"|
| style="text-align:right;"| 700
| style="text-align:left;"| E-motor and <br> E-transaxle (1T50LP) <br> for Mustang Mach-E
| Formerly Getrag Americas, a joint venture between [[w:Getrag|Getrag]] and the [[w:Getrag Ford Transmission|Getrag Ford Transmission]] joint venture. Became 100% owned by Ford in 2016 and launched conventional automatic transmission production in July 2017. Previously built the [[w:Ford PowerShift transmission|Ford PowerShift transmission]] (6DCT250 DPS6) <br /> [[w:Ford 6F transmission|Ford 6F15 transmission]]<br />[[w:Ford 8F transmission|Ford 8F24 transmission]].
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Jiangling Motors|Jiangling Motors Corp., Ltd.]] (JMC Fushan Assembly Plant)
| style="text-align:left;"| Xiaolan Economic Development Zone, [[w:Nanchang|Nanchang]], [[w:Jiangxi|Jiangxi]]
| style="text-align:left;"| China
| style="text-align:center;"|
| style="text-align:right;"| 1,725
| style="text-align:left;"| [[w:Ford Equator|Ford Equator]]<br />[[w:Ford Equator Sport|Ford Equator Sport]]<br />[[w:Ford Territory (China)|Ford Territory]] <br> [[w:Ford Bronco New Energy|Ford Bronco New Energy EV/EREV]] <br /> JMC models
| style="text-align:left;"| Partnership with [[w:Jiangling Motors Corporation Group#Jiangling Motor Holding and Jiangling Investment|Jiangling Investment Co., Ltd.]] Jiangling Motors is 32% owned by Ford. <br />
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Jiangling Motors|Jiangling Motors Corp., Ltd.]] (JMC Xiaolan Assembly Plant)
| style="text-align:left;"| Xiaolan Economic Development Zone, [[w:Nanchang|Nanchang]], [[w:Jiangxi|Jiangxi]]
| style="text-align:left;"| China
| style="text-align:center;"| 1997
| style="text-align:right;"| 1,660
| style="text-align:left;"| [[w:Ford Transit#Transit T8 (2023-present)|Ford Transit T8]]<br />[[w:Ford Transit Custom|Ford Transit]]<br />[[w:Ford Transit Custom|Ford Tourneo]] <br />[[w:Ford Ranger (T6)#Second generation (P703/RA; 2022)|Ford Ranger (T6)]]<br /> [[w:Ford Bronco#Sixth generation (U725; 2021)|Ford Bronco (U725)]] <br> [[w:Ford Transit City|Ford Transit City]]<br /> JMC models
| style="text-align:left;"| Partnership with [[w:Jiangling Motors Corporation Group#Jiangling Motor Holding and Jiangling Investment|Jiangling Investment Co., Ltd.]] Jiangling Motors is 32% owned by Ford. <br /> Previously: <br />[[w:Ford Transit#Chinese production|Ford Transit & Transit Classic]] <br /> [[w:Ford Transit#2021 Ford Transit Pro|Ford Transit Pro]]<br />[[w:Ford Everest#Second generation (U375/UA; 2015)|Ford Everest]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Jiangling Motors|Jiangling Motors Corp., Ltd.]] (JMC Xiaolan Engine Plant)
| style="text-align:left;"| Xiaolan Economic Development Zone, [[w:Nanchang|Nanchang]], [[w:Jiangxi|Jiangxi]]
| style="text-align:left;"| China
| style="text-align:center;"| 2015
| style="text-align:right;"|
| style="text-align:left;"| [[w:Ford EcoBoost engine#2.0 L (2010–2015)|Ford 2.0 L EcoBoost I4]]<br />JMC 1.5/1.8 GTDi engines<br />
| style="text-align:left;"| Partnership with [[w:Jiangling Motors Corporation Group#Jiangling Motor Holding and Jiangling Investment|Jiangling Investment Co., Ltd.]] Jiangling Motors is 32% owned by Ford.
|- style="vertical-align:top;"
| style="text-align:center;"| K (NA)
| style="text-align:left;"| [[W:Kansas City Assembly|Kansas City Assembly]]
| style="text-align:left;"| [[W:Claycomo, Missouri|Claycomo, Missouri]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1951 <br><br> 1957 (Vehicle production)
| style="text-align:right;"| 9,468
| style="text-align:left;"| [[w:Ford F-Series (fourteenth generation)|Ford F-150]] (2021-)<br /> [[w:Ford Transit#Fourth generation (2014)|Ford Transit]] (2015-)
| style="text-align:left;"| Original location at 1025 Winchester Ave. was first Ford factory in the USA built outside the Detroit area, lasted from 1912–1956. Replaced by Claycomo plant at 8121 US 69, which began to produce civilian vehicles on January 7, 1957 beginning with the Ford F-100 pickup. The Claycomo plant only produced for the military (including wings for B-46 bombers) from when it opened in 1951-1956, when it converted to civilian production.<br />Previously:<br /> [[w:Ford F-Series (third generation)|Ford F-Series (third generation)]]<br> (1957-1960)<br />[[w:Ford F-Series (fourth generation)|Ford F-Series (fourth generation)]]<br> (1961-1966)<br />[[w:Ford F-Series (fifth generation)|Ford F-Series (fifth generation)]]<br> (1967-1972)<br />[[w:Ford F-Series (sixth generation)|Ford F-Series (sixth generation)]]<br> (1973-1979)<br />[[w:Ford F-Series (seventh generation)|Ford F-Series (seventh generation)]] (1980-1986)<br />[[w:Ford F-Series (eighth generation)|Ford F-Series (eighth generation)]]<br> (1987-1991)<br />[[w:Ford F-Series (ninth generation)|Ford F-Series (ninth generation)]]<br> (1992-1996)<br />[[w:Ford F-Series (tenth generation)|Ford F-Series (tenth generation)]] [PN96]<br> (1997-2003 F-150, 1997-1999 F-250)<br />[[w:Ford F-Series (eleventh generation)|Ford F-Series (eleventh generation)]] (2004-2008 F-150)<br />[[w:Ford F-Series (twelfth generation)|Ford F-Series (twelfth generation)]] (2009-2014 F-150)<br />[[w:Ford F-Series (thirteenth generation)|Ford F-Series (thirteenth generation)]] (2015-2020 F-150)<br />[[w:Ford Galaxie|Ford Galaxie]] (1959) <br />[[w:Ford Falcon (North America)|Ford Falcon (compact)]] (1960-1962, 1964, 1966-1970)<br />[[w:Mercury Comet#First generation (1960–1963)|Comet]] (1960-1961)<br /> [[w:Mercury Comet|Mercury Comet]] (1962)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane]] (1962-1969)<br />[[w:Ford Torino|Ford Torino]] (1968-1969)<br />[[w:Ford Ranchero|Ford Ranchero]] (1957-1962, 1966-1969)<br /> [[w:Mercury Meteor#Intermediate (1962–1963)|Mercury Meteor]] (1962-1963)<br />[[w:Ford Maverick (1970–1977)|Ford Maverick]] (1970-1977)<br />[[w:Mercury Comet#Fifth generation (1971–1977)|Mercury Comet]] (1971-1977)<br />[[w:Ford Fairmont|Ford Fairmont]] (1978-1983)<br />[[w:Mercury Zephyr|Mercury Zephyr]] (1978-1983)<br />[[w:Ford Tempo|Ford Tempo]] (1984-1994)<br />[[w:Mercury Topaz|Mercury Topaz]] (1984-1994)<br />[[w:Ford Contour|Ford Contour]] (1995-2000)<br />[[w:Mercury Mystique|Mercury Mystique]] (1995-2000)<br />[[w:Ford Escape|Ford Escape]] (2001-2012)<br />[[w:Mercury Mariner|Mercury Mariner]] (2005-2011)<br />[[w:Mazda Tribute|Mazda Tribute]] (2001-2011)<br />[[w:Lincoln Blackwood|Lincoln Blackwood]] (2002)
|- style="vertical-align:top;"
| style="text-align:center;"| E (NA) for pickups & SUVs<br /> or <br /> V (NA) for med. & heavy trucks & bus chassis
| style="text-align:left;"| [[w:Kentucky Truck Assembly|Kentucky Truck Assembly]]
| style="text-align:left;"| [[w:Louisville, Kentucky|Louisville, Kentucky]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1969
| style="text-align:right;"| 9,251
| style="text-align:left;"| VIN code E:<br> [[w:Ford Super Duty|Ford Super Duty]] (1999-)<br /> [[w:Ford Expedition|Ford Expedition]] (2009-) <br /> [[w:Lincoln Navigator|Lincoln Navigator]] (2009-)
| Located at 3001 Chamberlain Lane. <br /> Previously:<br> VIN code V:<br> [[w:Ford B series|Ford B series]] (1970-1998)<br />[[w:Ford C series|Ford C series]] (1970-1990)<br />Ford W series<br />Ford CL series<br />[[w:Ford Cargo|Ford Cargo]] (1991-1997)<br />[[w:Ford L series|Ford L series/Louisville/Aeromax]]<br> (1970-1998) <br /> [[w:Ford F-Series (medium-duty truck)#Fifth generation (1967–1979)|Ford F-Series (medium-duty truck)]] (1970–1979) <br /> [[w:Ford F-Series (medium-duty truck)#Sixth generation (1980–1999)|Ford F-Series (medium-duty truck)]] (1980–1998)<br />VIN code E:<br> [[w:Ford F-Series (ninth generation)|Ford F-Series (ninth generation)]] - <br> (F-250: 1995-1997/F-350: 1994-1997/<br> F-Super Duty: 1994-1997)<br />[[w:Ford Excursion|Ford Excursion]] (2000-2005)
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Lima Engine|Lima Engine]]
| style="text-align:left;"| [[w:Lima, Ohio|Lima, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1957
| style="text-align:right;"| 1,457
| style="text-align:left;"| [[w:Ford EcoBoost engine#2.7 L Nano (first generation)|Ford 2.7/3.0 Nano EcoBoost V6]]<br />[[w:Ford Cyclone engine|Ford 3.3 Cyclone V6]]<br />[[w:Ford Cyclone engine|Ford 3.5/3.7 Cyclone V6 (for FWD vehicles)]]
| Previously: [[w:Ford MEL engine|Ford MEL engine]]<br />[[w:Ford 385 engine|Ford 385 engine]]<br />[[w:Ford straight-six engine#Third generation|Ford Thriftpower (Falcon) Six]]<br />[[w:Ford Pinto engine#Lima OHC (LL)|Ford Lima/Pinto I4]]<br />[[w:Ford HSC engine|Ford HSC I4]]<br />[[w:Ford Vulcan engine|Ford Vulcan V6]]<br /> [[w:Jaguar AJ-V8 engine#3.9 L|Jaguar AJ30/AJ35 - Ford 3.9L V8]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Livonia Transmission|Livonia Transmission]]
| style="text-align:left;"| [[w:Livonia, Michigan|Livonia, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1952
| style="text-align:right;"| 3,075
| style="text-align:left;"| [[w:Ford 6R transmission|Ford 6R transmission]]<br />[[w:Ford-GM 10-speed automatic transmission|Ford 10R60/10R80 transmission]]<br />[[w:Ford 8F transmission|Ford 8F35/8F40 transmission]] <br /> Service components
|
|- style="vertical-align:top;"
| style="text-align:center;"| U (NA)
| style="text-align:left;"| [[w:Louisville Assembly Plant|Louisville Assembly Plant]]
| style="text-align:left;"| [[w:Louisville, Kentucky|Louisville, Kentucky]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1955
| style="text-align:right;"| 3,483
| style="text-align:left;"| [[w:Ford Escape|Ford Escape]] (2013-2026)<br />[[w:Lincoln Corsair|Lincoln Corsair]] (2020-2026) <br> [[w:Ford Fathom|Ford Fathom]] EV (2028-)
| Original location opened in 1913. Ford then moved in 1916 and again in 1925. Current location at 2000 Fern Valley Rd. first opened on April 18, 1955. It produced both cars and trucks. The majority of Edsels were produced here.[https://www.edsel.com/registry/index.html] Passenger car production ended on June 12, 1981 when the last Ford LTD was produced at Louisville.[https://www.google.com/books/edition/The_Encyclopedia_of_Louisville/pXbYITw4ZesC?hl=en&gbpv=1&bsq=ford%20motor] The plant was then converted to build the Ranger pickup and the related Bronco II SUV. Ranger production began on January 18, 1982. The plant was upgraded and expanded to build Explorer, which launched in 1990 and replaced the Bronco II. Explorer was joined by the Mercury Mountaineer in April 1996. Ranger production ended in April 1999 but the Explorer Sport Trac pickup was built here beginning in 2000. The plant was idled in December 2010 and then reopened on April 4, 2012 to build the Ford Escape crossover which was followed by the Escape-based Lincoln MKC, later replaced by the Corsair. Escape and Corsair production ended in mid-December 2025 and the factory was then idled. <br />Previously: [[w:Lincoln MKC|Lincoln MKC]] (2015-2019)<br />[[w:Ford Explorer|Ford Explorer]] (1991-2010)<br />[[w:Mercury Mountaineer|Mercury Mountaineer]] (1997-2010)<br />[[w:Mazda Navajo|Mazda Navajo]] (1991-1994)<br />[[w:Ford Explorer#3-door / Explorer Sport|Ford Explorer Sport]] (2001-2003)<br />[[w:Ford Explorer Sport Trac|Ford Explorer Sport Trac]] (2001-2010)<br />[[w:Ford Bronco II|Ford Bronco II]] (1984-1990)<br />[[w:Ford Ranger (Americas)|Ford Ranger]] (1983-1999)<br /> [[w:Ford F-Series (medium-duty truck)#Third generation (1957–1960)|Ford F-Series (medium-duty truck)]] (1958)<br /> [[w:Ford F-Series (medium-duty truck)#Fifth generation (1967–1979)|Ford F-Series (medium-duty truck)]] (1967-1969)<br />[[w:Ford F-Series|Ford F-Series]] (1955-1957, 1973-1982)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1966, 1970-1981)<br />[[w:Edsel Pacer|Edsel Pacer]] (1958)<br />[[w:Edsel Ranger|Edsel Ranger]] (1958-1960)<br />[[w:Edsel Corsair#1959|Edsel Corsair]] (1959)<br />[[w:Edsel Roundup|Edsel Roundup]] (1958)<br />[[w:Edsel Villager|Edsel Villager]] (1958-1960)<br />[[w:Edsel Bermuda|Edsel Bermuda]] (1958)<br />[[w:Ford Custom|Ford Custom]] (1970)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane]] (1955-1958, 1960-1961)<br />[[w:Ford Ranchero|Ford Ranchero]] (1957)<br />[[w:Ford Galaxie|Ford Galaxie]] (1959-1971)<br />[[w:Ford 300|Ford 300]] (1963)<br />Heavy trucks were produced on a separate line from early 1958 until Kentucky Truck Plant opened in 1969. Includes [[w:Ford B series|Ford B series]] bus, [[w:Ford C series|Ford C series]], [[w:Ford H series|Ford H series]], Ford W series, and [[w:Ford L series#Background|Ford N-Series]] (1963-69). In addition to cars, F-Series light trucks were built from 1973-1981. Louisville Assembly was then converted to build the Ranger compact pickup, production of which began on January 18, 1982.
|- style="vertical-align:top;"
| style="text-align:center;"| L (NA) (1964-)
| style="text-align:left;"| [[w:Michigan Assembly Plant|Michigan Assembly Plant]] <br> Previously: Michigan Truck Plant
| style="text-align:left;"| [[w:Wayne, Michigan|Wayne, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1957
| style="text-align:right;"| 5,126
| style="text-align:Left;"| [[w:Ford Ranger (T6)#Second generation (P703/RA; 2022)|Ford Ranger (T6-P703)]] (2024-)<br /> [[w:Ford Bronco#Sixth generation (U725; 2021)|Ford Bronco (U725)]] (2021-)
| style="text-align:left;"| Located at 38303 Michigan Ave. Opened in 1957 to build station wagons as the Michigan Station Wagon Plant. Due to a sales slump, the plant was idled in 1959 until 1964. The plant was reopened and converted to build <br> F-Series trucks in 1964, becoming the Michigan Truck Plant. Was original production location for the [[w:Ford Bronco|Ford Bronco]] in 1966. In 1997, F-Series production ended so the plant could focus on the Expedition and Navigator full-size SUVs. In December 2008, Expedition and Navigator production ended and would move to the Kentucky Truck plant during 2009. In 2011, the Michigan Truck Plant was combined with the Wayne Stamping & Assembly Plant, which were then renamed the [[w:Michigan Assembly Plant|Michigan Assembly Plant]]. The plant was converted to build small cars, beginning with the 2012 Focus, followed by the 2013 C-Max. Car production ended in May 2018 and the plant was converted back to building trucks, beginning with the 2019 Ranger, followed by the 2021 Bronco.<br> Previously:<br />[[w:Ford Ranger (T6)#North American version (2019–2023)|Ford Ranger (T6-P375)]] (2019-2023)<br />[[w:Ford Focus (North America)|Ford Focus]] (2012-2018)<br />[[w:Ford C-Max#Second generation (2011)|Ford C-Max]] (2013-2018)<br /> [[w:Ford Bronco|Ford Bronco]] (1966-1996)<br />[[w:Ford Expedition|Ford Expedition]] (1997-2009)<br />[[w:Lincoln Navigator|Lincoln Navigator]] (1998-2009)<br />[[w:Ford F-Series|Ford F-Series]] (1964-1997)<br />[[w:Ford F-Series (ninth generation)#SVT Lightning|Ford F-150 Lightning]] (1993-1995)<br /> [[w:Mercury Colony Park|Mercury Colony Park]]
|- style="vertical-align:top;"
| style="text-align:center;"| H (NA)
| style="text-align:left;"| [[w:Multimatic|Multimatic]] <br> Markham Assembly
| style="text-align:left;"| [[w:Markham, Ontario|Markham, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| 2016-2022, 2025- (Ford production)
|
| [[w:Ford Mustang (seventh generation)#Mustang GTD|Ford Mustang GTD]] (2025-)
| Plant owned by [[w:Multimatic|Multimatic]] Inc.<br /> Previously:<br />[[w:Ford GT#Second generation (2016–2022)|Ford GT]] (2017-2022)
|- style="vertical-align:top;"
| style="text-align:center;"| S (NA) (for Pilot Plant),<br> No plant code for Mark II
| style="text-align:left;"| [[w:Ford Pilot Plant|New Model Programs Development Center]]
| style="text-align:left;"| [[w:Allen Park, Michigan|Allen Park, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1956
|
| style="text-align:left;"| Commonly known as "Pilot Plant"
| style="text-align:left;"| Located at 17000 Oakwood Boulevard. Originally Allen Park Body & Assembly to build the 1956-1957 [[w:Continental Mark II|Continental Mark II]]. Then was Edsel Division headquarters until 1959. Later became the New Model Programs Development Center, where new models and their manufacturing processes are developed and tested.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:fr:Nordex S.A.|Nordex S.A.]]
| style="text-align:left;"| [[w:Montevideo|Montevideo]]
| style="text-align:left;"| [[w:Uruguay|Uruguay]]
| style="text-align:center;"| 2021 (Ford production)
| style="text-align:right;"|
| style="text-align:left;"| [[w:Ford Transit#Fourth generation (2014)|Ford Transit]]
| style="text-align:left;"| Plant owned by Nordex S.A. Built under contract for Ford for South American markets.
|- style="vertical-align:top;"
| style="text-align:center;"| K (1954-1959)<br>/<br> No plant codes used (1960-1965)<br>/<br> B (NA) (1966-present)
| style="text-align:left;"| [[w:Oakville Assembly|Oakville Assembly]]
| style="text-align:left;"| [[w:Oakville, Ontario|Oakville, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| 1953
| style="text-align:right;"| 3,600
| style="text-align:left;"| [[w:Ford Super Duty|Ford Super Duty]] (2027-)
| style="text-align:left;"| Truck production moved to the neighboring Ontario Truck plant when it opened in 1965. After Ontario Truck closed in 2004, it was absorbed into the Oakville Assembly plant. Ford Edge production ended in May 2024 and Oakville Assembly was idled.<br /> Previously: <br />[[w:1952 Ford|1952 Ford]]<br />[[w:1955 Ford|1955 Ford]]<br />[[w:1957 Ford|1957 Ford]]<br />[[w:Ford Galaxie|Ford Galaxie]] (1967-1968, 1971)<br />[[w:Meteor (automobile)|Meteor cars]]<br />[[w:Ford Ranchero#First generation (1957–1959)|Meteor Ranchero]] (1957-1958)<br />[[w:Monarch (marque)|Monarch cars]]<br />[[w:Edsel Citation|Edsel Citation]] (1958)<br />[[w:Edsel Corsair|Edsel Corsair]] (1958-1959)<br />[[w:Edsel Pacer|Edsel Pacer]] (1958)<br />[[w:Edsel Ranger|Edsel Ranger]] (1958-1959)<br />[[w:Ford Falcon (North America)|Ford Falcon (compact)]] (1960-1968)<br />[[w:Frontenac (marque)|Frontenac]] (1960)<br />[[w:Mercury Comet|Mercury Comet]]<br />[[w:Ford Falcon (Americas)#Intermediate Falcon (1970½)|Ford Falcon (intermediate)]] (1970 1/2)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane]] (1970)<br />[[w:Ford Torino|Ford Torino]] (1970, 1972-1974)<br />[[w:Ford Custom#Custom and Custom 500 (1964-1981)|Ford Custom/Custom 500]] (1966-1967)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1969-1970, 1972, 1975-1982)<br />[[w:Ford LTD Crown Victoria|Ford LTD Crown Victoria]] (1983)<br />[[w:Mercury Montclair|Mercury Montclair]] (1966-1967)<br />[[w:Mercury Monterey|Mercury Monterey]] (1971)<br />[[w:Mercury Marquis|Mercury Marquis]] (1972, 1976-1977)<br />[[w:Mercury Park Lane|Mercury Park Lane]] (1968)<br />[[w:Ford Escort (North America)|Ford Escort]] (1984-1987)<br />[[w:Mercury Lynx|Mercury Lynx]] (1984-1987)<br />[[w:Ford Tempo|Ford Tempo]] (1984-1994)<br />[[w:Mercury Topaz|Mercury Topaz]] (1984-1994)<br />[[w:Ford Windstar|Ford Windstar]] (1995-2003)<br />[[w:Ford Freestar|Ford Freestar]] (2004-2007)<br />[[w:Ford Windstar#Mercury Monterey|Mercury Monterey]] (2004-2007)<br /> [[w:Ford Flex|Ford Flex]] (2009-2019)<br /> [[w:Lincoln MKT|Lincoln MKT]] (2010-2019)<br />[[w:Ford Edge|Ford Edge]] (2007-2024)<br />[[w:Lincoln MKX|Lincoln MKX]] (2007-2018) <br />[[w:Lincoln Nautilus#First generation (U540; 2019)|Lincoln Nautilus]] (2019-2023)<br />[[w:Ford E-Series|Ford Econoline]] (1961-1981)<br />[[w:Ford E-Series#First generation (1961–1967)|Mercury Econoline]] (1961-1965)<br />[[w:Ford F-Series|Ford F-Series]] (1954-1965)<br />[[w:Mercury M-Series|Mercury M-Series]] (1954-1965)
|- style="vertical-align:top;"
| style="text-align:center;"| D (NA)
| style="text-align:left;"| [[w:Ohio Assembly|Ohio Assembly]]
| style="text-align:left;"| [[w:Avon Lake, Ohio|Avon Lake, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1974
| style="text-align:right;"| 1,802
| style="text-align:left;"| [[w:Ford E-Series|Ford E-Series]]<br> (Body assembly: 1975-,<br> Final assembly: 2006-)<br> (Van thru 2014,<br> Cutaway thru present day)<br /> [[w:Ford F-Series (medium duty truck)#Eighth generation (2016–present)|Ford F-650/750]] (2016-)<br /> [[w:Ford Super Duty|Ford Super Duty <br /> F-350/450/550 Chassis Cab]] (2017-)<br /> [[w:Ford Super Duty|Ford Super Duty <br /> F-600 Chassis Cab]] (2020-)
| style="text-align:left;"| Was previously a Fruehauf truck trailer plant.<br />Previously: [[w:Ford Escape|Ford Escape]] (2004-2005)<br />[[w:Mercury Mariner|Mercury Mariner]] (2005-2006)<br />[[w:Mercury Villager|Mercury Villager]] (1993-2002)<br />[[w:Nissan Quest|Nissan Quest]] (1993-2002)
|- style="vertical-align:top;"
| style="text-align:center;"| B (SA)
| style="text-align:left;"| [[w:Pacheco Stamping and Assembly|Pacheco Stamping and Assembly]]
| style="text-align:left;"| [[w:General Pacheco|General Pacheco]], [[w:Buenos Aires Province|Buenos Aires Province]]
| style="text-align:left;"| [[w:Argentina|Argentina]]
| style="text-align:center;"| 1961
| style="text-align:right;"| 3,823
| style="text-align:left;"| [[w:Ford Ranger (T6)|Ford Ranger (T6)]]
| style="text-align:left;"| Part of [[w:Autolatina|Autolatina]] venture with VW from 1987 to 1996. Ford kept this side of the Pacheco plant when Autolatina dissolved while VW got the other side of the plant, which it still operates. This plant has made both cars and trucks. <br /> Formerly:<br /> [[w:Ford F-Series|Ford F-100/F-150]]<br />[[w:Ford F-Series|Ford F-250/F-350/F-3500/F-400/F-4000/F-500]]<br />[[w:Ford F-Series (medium duty truck)|Ford F-600/F-6000/F-700/F-7000]]<br />[[w:Ford B-Series|Ford B-Series]] (B-600/B-700/B-7000)<br /> [[w:Ford Falcon (Argentina)|Ford Falcon]] (1962 to 1991)<br />[[w:Ford Ranchero#Argentine Ranchero|Ford Ranchero]]<br /> [[w:Ford Taunus TC#Argentina|Ford Taunus]]<br /> [[w:Ford Sierra|Ford Sierra]]<br /> [[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Verona#Second generation (1993–1996)|Ford Verona]]<br />[[w:Ford Orion|Ford Orion]]<br /> [[w:Ford Fairlane (Americas)#Ford Fairlane in Argentina|Ford Fairlane]]<br />[[w:Ford Focus|Ford Focus]]<br />[[w:Ford Cargo|Ford Cargo]]<br />[[w:Ford Ranger (Americas)|Ford Ranger (US design)]]<br />[[w:Ford straight-six engine|Ford 170/187/188/221 inline-6]]<br />[[w:Ford Y-block engine#292|Ford 292 Y-block V8]]<br />[[w:Ford Duratorq engine#ZSD ("Puma")|Ford 2.2/3.2 Puma diesel engine]]<br />[[w:Volkswagen Pointer|VW Pointer]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Rawsonville Components
| style="text-align:left;"| [[w:Ypsilanti, Michigan|Ypsilanti, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1956
| style="text-align:right;"| 788
| style="text-align:left;"| Integrated Air/Fuel Modules<br /> Air Induction Systems<br> Transmission Oil Pumps<br />HEV and PHEV Batteries<br /> Fuel Pumps<br /> Carbon Canisters<br />Ignition Coils<br />Transmission components for Van Dyke Transmission Plant
| style="text-align:left;"| Located at 10300 Textile Road. Spun off as part of [[w:Visteon|Visteon]] in 2000. Taken back by Ford in 2005 as part of [[w:Automotive Components Holdings|Automotive Components Holdings]] LLC. Sold to parent Ford in 2009.
|- style="vertical-align:top;"
| style="text-align:center;"| L (N. American-style VIN position)
| style="text-align:left;"| RMA Automotive Cambodia
| style="text-align:left;"| [[w:Krakor district|Krakor district]], [[w:Pursat province|Pursat province]]
| style="text-align:left;"| [[w:Cambodia|Cambodia]]
| style="text-align:center;"| 2022
| style="text-align:right;"|
| style="text-align:left;"| [[w:Ford Ranger (T6)|Ford Ranger (T6)]]<br />[[w:Ford Everest|Ford Everest]] <br /> [[w:Ford Territory (China)#Second generation (CX743MCA; 2022)|Ford Territory]] [https://cambodianess.com/article/rma-cambodia-plc-officially-launches-new-ford-production-line-and-ford-sub-assembly-plant-in-pursat-province]
| style="text-align:left;"| Plant belongs to RMA Group, Ford's distributor in Cambodia. Builds vehicles under license from Ford.
|- style="vertical-align:top;"
| style="text-align:center;"| C (EU) [when following G] [includes <br> US-mkt. '78-'80 Ford Fiesta] <br>/<br> 4 (NA) ['16-'18 US-mkt. <br> Focus RS]
| style="text-align:left;"| [[w:Saarlouis Body & Assembly|Saarlouis Body & Assembly]]
| style="text-align:left;"| [[w:Saarlouis|Saarlouis]], [[w:Saarland|Saarland]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| 1968 (components), 1970 (vehicle prod.)
| style="text-align:right;"| 1,276
| style="text-align:left;"|
| style="text-align:left;"| Plant was built on the site of the former Roderberg airfield. First opened as a components plant in 1968, supplying other Ford plants and also supplying Renault with body panels. This production ended once Ford Escort production began in 1970. The first Escort body shell was completed on October 20, 1969. Began vehicle production with the Escort on January 16, 1970. Saarlouis shared Escort production with Ford's Halewood, UK plant. About 150,000 Capris were built at Saarlouis from 1971-1975, including the 1 millionth Capri built, an RS2600 completed on August 29, 1973. Fiesta began production at Saarlouis on May 11, 1976 and ended in 1980. Over 700,000 Fiestas were built in Saarlouis. Escort was replaced by the Focus in 1998. Saarlouis produced over 6.5 million Escorts from 1970-1998. Focus began production on August 10, 1998. All Focus RS & RS500 models were made in Saarlouis. In June 2013, the Ford Focus Electric began production in Saarlouis. It was the first fully electric Ford in Europe and the first fully electric car to be produced in Germany. Production ended by April 2017. C-Max production began in Saarlouis in November 2003. C-Max production shifted to Valencia, Spain in 2010 but returned to Saarlouis in 2014. C-Max production ended in June 2019 and was discontinued. About 1.2 million <br> C-Max vehicles were built at Saarlouis. Last Focus ST produced September 26, 2025. Last Focus, a white 5-d hatchback, was produced on November 14, 2025. That was the end of vehicle production at Saarlouis. In 1980, Saarlouis built its 2 millionth vehicle, a Fiesta 3-d. In February 1990, Saarlouis produced its 5 millionth vehicle, a 4th gen. Escort. In July 2005, Saarlouis produced its 10 millionth vehicle, a blue Focus wagon. On November 19, 2007, Saarlouis produced its 11 millionth vehicle, a silver C-Max. On August 26, 2010, the 12 millionth vehicle, a white Focus 5-d hatchback, was produced. On June 16, 2016, the 14 millionth vehicle, a red Focus 5-d hatchback, was produced. In December 2019, Saarlouis produced its 15 millionth vehicle, a red Focus ST 5-d. About 15.6 million vehicles were produced in total at Saarlouis.<br /> Previously: [[w:Ford Escort (Europe)|Ford Escort]] (1970-1998)<br />[[w:Ford Orion|Ford Orion]] (1983-1993)<br />[[w:Ford Capri|Ford Capri]] (1971-1975)<br />[[w:Ford Fiesta|Ford Fiesta]] (1976-1980)<br />[[w:Ford Focus|Ford Focus]] (1998-2025)<br />[[w:Ford C-Max|Ford C-Max]] (2003-2010, 2015-2019)<br />[[w:Ford Kuga#First generation (C394; 2008)|Ford Kuga]] (Gen 1: 2008-2012)
|- style="vertical-align:top;"
|
| [[w:Ford India|Sanand Engine Plant]]
| [[w:Sanand|Sanand]], [[w:Gujarat|Gujarat]]
| [[w:India|India]]
| style="text-align:center;"| 2015
|
| [[w:Ford EcoBlue engine|Ford EcoBlue/Panther 2.0L Diesel I4 engine]]
| Although the Sanand property including the assembly plant was sold to [[w:Tata Motors|Tata Motors]] in 2022, the engine plant buildings and property were leased back from Tata by Ford India so that the engine plant could continue building diesel engines for export to Thailand, Vietnam, and Argentina. <br /> Previously: [[w:List of Ford engines#1.2 L Dragon|1.2/1.5 Ti-VCT Dragon I3]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Sharonville Transmission|Sharonville Transmission]]
| style="text-align:left;"| [[w:Sharonville, Ohio|Sharonville, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1958
| style="text-align:right;"| 2,003
| style="text-align:left;"| Ford 6R140 transmission<br /> [[w:Ford-GM 10-speed automatic transmission|Ford 10R80/10R140 transmission]]<br /> Gears for 6R80/140, 6F35/50/55, & 8F57 transmissions <br />
| Located at 3000 E Sharon Rd. <br /> Previously: [[w:Ford 4R70W transmission|Ford 4R70W transmission]]<br /> [[w:Ford C6 transmission#4R100|Ford 4R100 transmission]]<br /> Ford 5R110W transmission<br /> [[w:Ford C3 transmission#5R44E/5R55E/N/S/W|Ford 5R55S transmission]]<br /> [[w:Ford CD4E transmission|Ford CD4E transmission]]<br /> Ford FN transmission
|- style="vertical-align:top;"
|
| style="text-align:left;"| Sterling Axle
| style="text-align:left;"| [[w:Sterling Heights, Michigan|Sterling Heights, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1956
| style="text-align:right;"| 2,391
| style="text-align:left;"| Front axles<br /> Rear axles<br /> Rear drive units
| style="text-align:left;"| Located at 39000 Mound Rd. Spun off as part of [[w:Visteon|Visteon]] in 2000; taken back by Ford in 2005 as part of [[w:Automotive Components Holdings|Automotive Components Holdings]] LLC.
|- style="vertical-align:top;"
| style="text-align:center;"| P (EU) [when following W] /<br> 1 (NA) ('14-'23 Transit Connect)
| style="text-align:left;"| [[w:Ford Valencia Body and Assembly|Ford Valencia Body and Assembly]]
| style="text-align:left;"| [[w:Almussafes|Almussafes]], [[w:Province of Valencia|Valencia]]
| style="text-align:left;"| [[w:Spain|Spain]]
| style="text-align:center;"| 1976
| style="text-align:right;"| 5,400
| style="text-align:left;"| [[w:Ford Kuga#Third generation (C482; 2019)|Ford Kuga]] (Gen 3)
| Previously: [[w:Ford C-Max#Second generation (2011)|Ford C-Max]]<br />[[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Fiesta|Ford Fiesta]]<br />[[w:Ford Focus|Ford Focus]]<br />[[w:Ford Galaxy#Third generation (CD390; 2015)|Ford Galaxy]]<br />[[w:Ford Ka#First generation (BE146; 1996)|Ford Ka]]<br />[[w:Ford Kuga#Second generation (C520; 2012)|Ford Kuga]] (Gen 2)<br />[[w:Ford Mondeo (fourth generation)|Ford Mondeo]]<br />[[w:Ford Orion|Ford Orion]] <br /> [[w:Ford S-Max#Second generation (CD539; 2015)|Ford S-Max]] <br /> [[w:Ford Transit Connect#Second generation (2012)|Ford Transit Connect]]<br /> [[w:Ford Transit Connect#Second generation (2012)|Ford Tourneo Connect]]<br />[[w:Mazda2#First generation (DY; 2002)|Mazda 2]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Valencia Engine
| style="text-align:left;"| [[w:Almussafes|Almussafes]], [[w:Province of Valencia|Valencia]]
| style="text-align:left;"| [[w:Spain|Spain]]
| style="text-align:center;"| 1976
| style="text-align:right;"| 1,000
| style="text-align:left;"| [[w:Mazda L engine|Ford Duratec HE 1.8/2.0]]<br /> [[w:Ford EcoBoost engine#2.0 L (2010–2015)|Ford Ecoboost 2.0L]]<br />[[w:Ford EcoBoost engine#2.3 L|Ford Ecoboost 2.3L]]
| Previously: [[w:Ford Kent engine#Valencia|Ford Kent/Valencia engine]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Van Dyke Electric Powertrain Center
| style="text-align:left;"| [[w:Sterling Heights, Michigan|Sterling Heights, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1968
| style="text-align:right;"| 1,444
| style="text-align:left;"| [[w:Ford 6F transmission|Ford 6F35/6F55]]<br /> Ford HF35/HF45 transmission for hybrids & PHEVs<br />Ford 8F57 transmission<br />Electric motors (eMotor) for hybrids & EVs<br />Electric vehicle transmissions
| Located at 41111 Van Dyke Ave. Formerly known as Van Dyke Transmission Plant.<br />Originally made suspension parts. Began making transmissions in 1993.<br /> Previously: [[w:Ford AX4N transmission|Ford AX4N transmission]]<br /> Ford FN transmission
|- style="vertical-align:top;"
| style="text-align:center;"| X (for VW & for Ford)
| style="text-align:left;"| Volkswagen Poznań
| style="text-align:left;"| [[w:Poznań|Poznań]]
| style="text-align:left;"| [[w:Poland|Poland]]
| style="text-align:center;"|
|
| [[w:Ford Transit Connect#Third generation (2021)|Ford Tourneo Connect]]<br />[[w:Ford Transit Connect#Third generation (2021)|Ford Transit Connect]]<br />[[w:Volkswagen Caddy#Fourth generation (Typ SB; 2020)|VW Caddy]]<br />
| Plant owned by [[W:Volkswagen|Volkswagen]]. Production for Ford began in 2022. <br> Previously: [[w:Volkswagen Transporter (T6)|VW Transporter (T6)]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Windsor Engine Plant
| style="text-align:left;"| [[w:Windsor, Ontario|Windsor, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| 1923
| style="text-align:right;"| 1,850
| style="text-align:left;"| [[w:Ford Godzilla engine|Ford 7.3L Godzilla V8]]
| Main Windsor Engine Plant closed but the Windsor Annex Engine Plant, located on the south end of the Windsor Engine Plant property off Seminole Street, is still open. <br> Previously: [[w:Ford small block engine|Ford 255/289/302/351 Windsor V8]]<br />[[w:Ford Modular engine|Ford Modular engine]]: 4.6/5.4L V8 & 6.8L V10<br>[[w:Ford Godzilla engine|Ford 6.8 Godzilla V8]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Woodhaven Forging
| style="text-align:left;"| [[w:Woodhaven, Michigan|Woodhaven, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1995
| style="text-align:right;"| 86
| style="text-align:left;"| Crankshaft forgings for 2.7/3.0 Nano EcoBoost V6, 3.5 Cyclone V6, & 3.5 EcoBoost V6
| Located at 24189 Allen Rd.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Woodhaven Stamping
| style="text-align:left;"| [[w:Woodhaven, Michigan|Woodhaven, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1964
| style="text-align:right;"| 499
| style="text-align:left;"| Body panels
| Located at 20900 West Rd.
|}
==Future production facilities==
{| class="wikitable sortable" style="font-size:90%"
|-
! style="width:120px;"| VIN
! style="width:200px;"| Name
! style="width:100px;"| City/state
! style="width:100px;"| Country
! style="width:120px;" class="unsortable"| Status
! style="width:150px;"| Employees
! style="width:200px;"| Products
! style="width:300px;" class="unsortable"| Comments
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Blue Oval City|Tennessee Truck Plant]]
| style="text-align:left;"| [[w:Stanton, Tennessee|Stanton, Tennessee]]
| style="text-align:left;"| U.S.
| style="background:lightyellow;{{Text default color}}; text-align:center;"| Announced
| style="text-align:right;"| ~6,000
| style="text-align:left;"| Ford gas-powered pickup
| Was scheduled to start EV production in 2028, following delays. As of December 2025, plant is renamed Tennessee Truck Plant and production of a gas-powered truck is scheduled to start in 2029. Battery manufacturing onsite would have been part of BlueOval SK, a joint venture with SK On, a subsidiary of [[w:SK Innovation|SK Innovation]].<ref name=BlueOval>{{cite news|url=https://www.detroitnews.com/story/business/autos/ford/2021/09/27/ford-four-new-plants-tennessee-kentucky-electric-vehicles/5879885001/|title=Ford, partner to spend $11.4B on four new plants in Tennessee, Kentucky to support EVs|first1=Jordyn|last1=Grzelewski|first2=Riley|last2=Beggin|newspaper=The Detroit News|date=September 27, 2021|accessdate=September 27, 2021}}</ref> However, as of December 2025, the venture is being dissolved. Ford will keep the Kentucky battery plants while SK On will keep the Tennessee battery plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| BlueOval SK Battery Park
| style="text-align:left;"| [[w:Glendale, Kentucky|Glendale, Kentucky]]
| style="text-align:left;"| U.S.
| style="background:lightyellow;{{Text default color}}; text-align:center;"| Announced
| style="text-align:right;"| ~5,000
| style="text-align:left;"| Lithium-ion Batteries for E-Transit and LFP batteries for energy storage systems
| Consists of 2 battery plants. Both were originally scheduled to start production in 2025. Plant 1 began commercial production on August 19, 2025 but Plant 2 has been delayed to 2027. Part of BlueOval SK, a joint venture between Ford Motor Company and SK On, a subsidiary of SK Innovation.<ref name=BlueOval/> As of December 2025, the venture is being dissolved. Ford will keep the Kentucky battery plants while SK On will keep the Tennessee battery plant. The Glendale plant is now making battery packs for Ford Energy, a new Ford subsidiary making battery energy storage systems for data centers, utilities, and large industrial and commercial customers in the U.S. <br> Previously: Lithium-ion Batteries for F-150 Lightning
|}
==Former production facilities==
{| class="wikitable sortable" style="font-size:90%"
|-
! style="width:120px;"| VIN
! style="width:220px;"| Name
! style="width:100px;"| City/State
! style="width:100px;"| Country
! style="width:100px;" class="unsortable"| Years
! style="width:250px;"| Products
! style="width:350px;" class="unsortable"| Comments
|
|- style="vertical-align:top;"
| style="text-align:center;"| F (EU) [serial# starts with BF]
| style="text-align:left;"| Advanced Vehicle Operations (AVO) "Aveley plant"
| style="text-align:left;"| [[w:South Ockendon|South Ockendon]], [[w:Essex|Essex]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Vehicle production from Nov. 1970 - Early 1975
| style="text-align:left;"| [[w:Ford Escort (Europe)#First generation (1967)|Ford Escort]] Mexico, RS1600, & RS2000 models
| Was located on Arisdale Avenue in South Ockendon. Plant was set up to build special, high performance Escort models that needed extra work to build, which the Halewood plant was struggling to do. Escort two-door bodyshells, already painted, trimmed, and built to strengthened Type 49 specification, were shipped in directly from the Halewood plant that built mainstream Escorts. Once at the AVO plant, the bodies were placed on an overhead carousel which ran around the factory. As the cars moved around, the engine, transmission, and suspension were fitted from below. When auto sales declined following the 1973 Energy Crisis, spare capacity opened up at the mainstream Escort plants and a dedicated plant for performance versions was no longer needed and the AVO plant closed in early 1975.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Alexandria Assembly
| style="text-align:left;"| [[w:Alexandria|Alexandria]]
| style="text-align:left;"| [[w:Egypt|Egypt]]
| style="text-align:center;"| 1950-1966
| style="text-align:left;"| Ford trucks including [[w:Thames Trader|Thames Trader]] trucks
| Opened in 1950.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Ali Automobiles
| style="text-align:left;"| [[w:Karachi|Karachi]]
| style="text-align:left;"| [[w:Pakistan|Pakistan]]
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Anglia|Ford Anglia]], [[w:Ford Cortina|Ford Cortina]], [[w:Ford Transit#Taunus Transit (1953)|Ford Kombi]], [[w:Ford F-Series second generation|Ford F-Series pickups]]
| Ford production ended. Ali Automobiles was nationalized in 1972, becoming Awami Autos. Today, Awami is partnered with Suzuki in the Pak Suzuki joint venture.
|- style="vertical-align:top;"
| style="text-align:center;"| N (EU) [when following C]
| style="text-align:left;"| Amsterdam Assembly
| style="text-align:left;"| [[w:Amsterdam|Amsterdam]]
| style="text-align:left;"| [[w:Netherlands|Netherlands]]
| style="text-align:center;"| 1932-1981
| style="text-align:left;"| [[w:Ford Transit|Ford Transit]], [[w:Ford Transcontinental|Ford Transcontinental]], [[w:Ford D Series|Ford D-Series]],<br> Ford N-Series (EU)
| Assembled a wide range of Ford products primarily for the local market from Sept. 1932–Nov. 1981. Began with the [[w:1932 Ford|1932 Ford]]. Car assembly (latterly [[w:Ford Anglia|Ford Anglia]], [[w:Ford Corsair|Ford Corsair]], [[w:Ford Cortina|Ford Cortina]], [[w:Ford Zephyr|Ford Zephyr]], [[w:Ford Zodiac|Ford Zodiac]], [[w:Ford Escort (Europe)|Ford Escort]], [[w:Ford Vedette|Ford Vedette]], and [[w:Ford Taunus|Ford Taunus]]) ended 1978. Also, [[w:Ford Mustang (first generation)|Ford Mustang]], [[w:Ford Custom 500|Ford Custom 500]]
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Antwerp Assembly
| style="text-align:left;"| [[w:Antwerp|Antwerp]]
| style="text-align:left;"| [[w:Belgium|Belgium]]
| style="text-align:center;"| 1922-1964
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:Ford Model Y|Ford Model Y]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:1949 Ford|1949 Ford]]<br />[[w:Ford Taunus P3|Ford Taunus P3]]<br />[[w:Ford Taunus P4|Ford Taunus P4]]<br />[[w:Ford Falcon (North America)|Ford Falcon]]<br />[[w:Ford Fairlane (Americas)|Ford Fairlane]]<br />[[w:Edsel|Edsel]] (CKD)<br />[[w:Ford F-Series|Ford F-Series]]
| Original plant was on Rue Dubois from 1922 to 1926. Ford then moved to the Hoboken District of Antwerp in 1926 until they moved to a plant near the Bassin Canal in 1931. Replaced by the Genk plant that opened in 1964, however tractors were then made at Antwerp for some time after car & truck production ended.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford France|Asnières-sur-Seine Assembly]]
| style="text-align:left;"| [[w:Asnières-sur-Seine|Asnières-sur-Seine]]
| style="text-align:left;"| [[w:France|France]]
| style="text-align:center;"| Sold
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:Ford Model Y|Ford Model Y]] (Ford 6CV)
| Ford sold the plant to Société Immobilière Industrielle d'Asnières or SIIDA on April 30, 1941. SIIDA leased it to the LAFFLY company (New Machine Tool Company) on October 30, 1941. [[w:Citroën|Citroën]] then bought most of the shares in LAFFLY in 1948 and the lease was transferred from LAFFLY to [[w:Citroën|Citroën]] in 1949, which then began to move in and set up production. A hydraulics building for the manufacture of the hydropneumatic suspension of the DS was built in 1953. [[w:Citroën|Citroën]] manufactured machined parts and hydraulic components for its hydropneumatic suspension system (also supplied to [[w:Rolls-Royce Motors|Rolls-Royce Motors]]) at Asnières as well as steering components and connecting rods & camshafts after Nanterre was closed. SIIDA was taken over by Citroën on September 2, 1968. In 2000, the Asnières site became a joint venture between [[w:Siemens|Siemens Automotive]] and [[w:PSA Group|PSA Group]] (Siemens 52% -PSA 48%) called Siemens Automotive Hydraulics SA (SAH). In 2007, when [[w:Continental AG|Continental AG]] took over [[w:Siemens VDO|Siemens VDO]], SAH became CAAF (Continental Automotive Asnières France) and PSA sold off its stake in the joint venture. Continental closed the Asnières plant in 2009. Most of the site was demolished between 2011 and 2013.
|- style="vertical-align:top;"
| style="text-align:center;"| G
| style="text-align:left;"| Aston Martin Gaydon Assembly
| style="text-align:left;"| [[w:Gaydon|Gaydon, Warwickshire]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"|
| style="text-align:left;"| [[w:Aston Martin DB9|Aston Martin DB9]]<br />[[w:Aston Martin Vantage (2005)|Aston Martin V8 Vantage/V12 Vantage]]<br />[[w:Aston Martin DBS V12|Aston Martin DBS V12]]
| style="text-align:left;"| Sold along with [[w:Aston Martin|Aston Martin]].
|- style="vertical-align:top;"
| style="text-align:center;"| T (DBS-based V8 & Lagonda sedan), <br /> B (Virage & Vanquish)
| style="text-align:left;"| Aston Martin Newport Pagnell Assembly
| style="text-align:left;"| [[w:Newport Pagnell|Newport Pagnell]], [[w:Buckinghamshire|Buckinghamshire]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Sold
| style="text-align:left;"| [[w:Aston Martin Vanquish#First generation (2001–2007)|Aston Martin V12 Vanquish]]<br />[[w:Aston Martin Virage|Aston Martin Virage]] 1st generation <br />[[w:Aston Martin V8|Aston Martin V8]]<br />[[w:Aston Martin Lagonda|Aston Martin Lagonda sedan]] <br />[[w:Aston Martin V8 engine|Aston Martin V8 engine]]
| style="text-align:left;"| Sold along with [[w:Aston Martin|Aston Martin]].
|- style="vertical-align:top;"
| style="text-align:center;"| AT/A (NA)
| style="text-align:left;"| [[w:Atlanta Assembly|Atlanta Assembly]]
| style="text-align:left;"| [[w:Hapeville, Georgia|Hapeville, Georgia]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1947-2006
| style="text-align:left;"| [[w:Ford Taurus|Ford Taurus]] (1986-2007)<br /> [[w:Mercury Sable|Mercury Sable]] (1986-2005)
| Began F-Series production December 3, 1947. Demolished. Site now occupied by the headquarters of Porsche North America.<ref>{{cite web|title=Porsche breaks ground in Hapeville on new North American HQ|url=http://www.cbsatlanta.com/story/20194429/porsche-breaks-ground-in-hapeville-on-new-north-american-hq|publisher=CBS Atlanta}}</ref> <br />Previously: <br /> [[w:Ford F-Series|Ford F-Series]] (1951-1956, 1958, 1960)<br />[[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1967)<br />[[w:Ford Galaxie|Ford Galaxie]] (1959-1961, 1963-1967)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1966, 1969, 1979-1980)<br />[[w:Mercury Marquis|Mercury Marquis]]<br />[[w:Ford Falcon (North America)|Ford Falcon (compact)]] (1961-1964)<br />[[w:Ford Falcon (North America)#Intermediate Falcon (1970½)|Ford Falcon (intermediate)]] (1970 1/2)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane]] (1962-1963, 1965-1970)<br />[[w:Ford Torino|Ford Torino]] (1968-1976)<br />[[w:Ford Ranchero|Ford Ranchero]] (1969-1977)<br />[[w:Mercury Montego|Mercury Montego]]<br />[[w:Mercury Cougar#Third generation (1974–1976)|Mercury Cougar]] (1974-1976)<br />[[w:Ford LTD II|Ford LTD II]] (1977-1978)<br />[[w:Mercury Cougar#Fourth generation (1977–1979)|Mercury Cougar XR-7]] (1977)<br />[[w:Ford Fairmont|Ford Fairmont]] (1981-1982)<br />[[w:Mercury Zephyr|Mercury Zephyr]] (1981-1982)<br />[[w:Ford Granada (North America)#Second generation (1981–1982)|Ford Granada]] (1981-1982)<br />[[w:Mercury Cougar#Fifth generation (1980–1982)|Mercury Cougar]] (non-XR-7 models only) (1981-1982)<br />[[w:Ford Thunderbird (ninth generation)|Ford Thunderbird (Gen 9)]] (1983-1985)<br />[[w:Mercury Cougar#Sixth generation (1983–1988)|Mercury Cougar]] (1984-1985)
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Auckland Operations
| style="text-align:left;"| [[w:Wiri|Wiri]]
| style="text-align:left;"| [[w:New Zealand|New Zealand]]
| style="text-align:center;"| 1973-1997
| style="text-align:left;"| [[w:Ford Laser|Ford Laser]]<br />[[w:Ford Telstar|Ford Telstar]]<br />[[w:Ford Falcon (Australia)|Ford Falcon]]<br /> [[w:Mazda 323|Mazda 323]]<br /> [[w:Mazda 626|Mazda 626]]
| style="text-align:left;"| Opened in 1973 as Wiri Assembly (also included transmission & chassis component plants), name changed in 1983 to Auckland Operations, became a joint venture with Mazda called Vehicles Assemblers of New Zealand (VANZ) in 1987, closed in 1997.
|- style="vertical-align:top;"
| style="text-align:center;"| S (EU) [when following P] (for Ford),<br> V (for VW & Seat)
| style="text-align:left;"| [[w:Autoeuropa|Autoeuropa]]
| style="text-align:left;"| [[w:Palmela|Palmela]]
| style="text-align:left;"| [[w:Portugal|Portugal]]
| style="text-align:center;"| Sold to [[w:Volkswagen|Volkswagen]] in 1999, Ford production ended in 2006
| [[w:Ford Galaxy#First generation (V191; 1995)|Ford Galaxy (1995–2006)]]<br />[[w:Volkswagen Sharan|Volkswagen Sharan]]<br />[[w:SEAT Alhambra|SEAT Alhambra]]
| Autoeuropa was a 50/50 joint venture between Ford & VW created in 1991. Production began in 1995. Ford sold its half of the plant to VW in 1999 but the Ford Galaxy continued to be built at the plant until the first generation ended production in 2006.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Automotive Industries|Automotive Industries]], Ltd. (AIL)
| style="text-align:left;"| [[w:Nazareth Illit|Nazareth Illit]]
| style="text-align:left;"| [[w:Israel|Israel]]
| style="text-align:center;"| 1968-1985?
| style="text-align:left;"| [[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Transit|Ford Transit]]<br />[[w:Ford D Series|Ford D Series]]<br />[[w:Ford L-Series|Ford L-9000]]
| Car production began in 1968 in conjunction with Ford's local distributor, Israeli Automobile Corp. Truck production began in 1973. Ford Escort production ended in 1981. Truck production may have continued to c.1985.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Avtotor|Avtotor]]
| style="text-align:left;"| [[w:Kaliningrad|Kaliningrad]]
| style="text-align:left;"| [[w:Russia|Russia]]
| style="text-align:center;"| Suspended
| style="text-align:left;"| [[w:Ford Cargo|Ford Cargo]] truck<br />[[w:Ford F-MAX|Ford F-MAX]]
| Produced trucks under contract for Ford Otosan. Production began with the Cargo in 2015; the F-Max was added in 2019.
|- style="vertical-align:top;"
| style="text-align:center;"| P (EU) [when following C]
| style="text-align:left;"| Azambuja Assembly
| style="text-align:left;"| [[w:Azambuja|Azambuja]]
| style="text-align:left;"| [[w:Portugal|Portugal]]
| style="text-align:center;"| Closed in 2000
| style="text-align:left;"| [[w:Ford Anglia|Ford Anglia]]<br /> [[w:Ford Cortina|Ford Cortina]]<br />[[w:Ford Escort (Europe)|Ford Escort]]<br /> [[w:Ford Granada (Europe)|Ford Granada]]<br />[[w:Ford P100#Sierra-based model|Ford P100]]<br />[[w:Ford Taunus P4|Ford Taunus P4]] (12M)<br />[[w:Ford Transit#Taunus Transit (1953)|Ford Taunus Transit]]<br />[[w:Ford Thames 400E|Ford Thames 400E]]<br />[[w:Ford Transit|Ford Transit]]<br />[[w:Thames Trader|Thames Trader]]
|
|- style="vertical-align:top;"
| style="text-align:center;"| G (EU) [when following W] (Ford Maverick made by Nissan)
| style="text-align:left;"| Barcelona Assembly
| style="text-align:left;"| [[w:Barcelona|Barcelona]]
| style="text-align:left;"| [[w:Spain|Spain]]
| style="text-align:center;"| 1923-1954
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model Y|Ford Model Y]], [[w:Ford Model C Ten|Ford Model C Ten]]
| Became Motor Iberica SA after nationalization in 1954. Built Ford's [[w:Thames Trader|Thames Trader]] trucks under license which were sold under the [[w:Ebro trucks|Ebro]] name. Later taken over in stages by Nissan from 1979 to 1987 when it became [[w:Nissan Motor Ibérica|Nissan Motor Ibérica]] SA. Under Nissan, the [[w:Nissan Terrano II|Ford Maverick]] SUV was built in the Barcelona plant under an OEM agreement.
|- style="vertical-align:top;"
| style="text-align:left;"|
| style="text-align:left;"| [[w:Ford Motor Argentina|Barracas Assembly]]
| style="text-align:left;"| [[w:Barracas, Buenos Aires|Barracas]], [[w:Buenos Aires|Buenos Aires]]
| style="text-align:left;"| [[w:Argentina|Argentina]]
| style="text-align:center;"| 1916-1922
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| First Ford assembly plant in Latin America and the second outside North America after Britain. Replaced by the La Boca plant in 1922.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Basildon
| style="text-align:left;"| [[w:Basildon|Basildon]], [[w:Essex|Essex]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|U.K.]]
| style="text-align:center;"| 1964-1991
| style="text-align:left;"| Ford tractor range
| style="text-align:left;"| Sold with New Holland tractor business
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Batavia Transmission|Batavia Transmission]]
| style="text-align:left;"| [[w:Batavia, Ohio|Batavia, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1980-2008
| style="text-align:left;"| [[w:Ford CD4E transmission|Ford CD4E transmission]]<br /> [[w:Ford ATX transmission|Ford ATX transmission]]<br />[[w:Batavia Transmission#Partnership|CFT23 & CFT30 CVT transmissions]] produced as part of ZF Batavia joint venture with [[w:ZF Friedrichshafen|ZF Friedrichshafen]]
| ZF Batavia joint venture was created in 1999 and was 49% owned by Ford and 51% owned by [[w:ZF Friedrichshafen|ZF Friedrichshafen]]. Jointly developed CVT production began in late 2003. Ford bought out ZF in 2005 and the plant became Batavia Transmissions LLC, owned 100% by Ford.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Germany|Berlin Assembly]]
| style="text-align:left;"| [[w:Berlin|Berlin]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| Closed 1931
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model TT|Ford Model TT]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]
| Replaced by Cologne plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Ford Aquitaine Industries Bordeaux Automatic Transmission Plant
| style="text-align:left;"| [[w:Blanquefort, Gironde|Blanquefort]]
| style="text-align:left;"| [[w:France|France]]
| style="text-align:center;"| 1973-2019
| style="text-align:left;"| [[w:Ford C3 transmission|Ford C3/A4LD/A4LDE/4R44E/4R55E/5R44E/5R55E/5R55S/5R55W 3-, 4-, & 5-speed automatic transmissions]]<br />[[w:Ford 6F transmission|Ford 6F35 6-speed automatic transmission]]<br />Components
| Sold to HZ Holding in 2009 but the deal collapsed and Ford bought the plant back in 2011. Closed in September 2019. Demolished in 2021.
|- style="vertical-align:top;"
| style="text-align:center;"| K (for DB7)
| style="text-align:left;"| Bloxham Assembly
| style="text-align:left;"| [[w:Bloxham|Bloxham]], [[w:Oxfordshire|Oxfordshire]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|U.K.]]
| style="text-align:center;"| Closed 2003
| style="text-align:left;"| [[w:Aston Martin DB7|Aston Martin DB7]]<br />[[w:Jaguar XJ220|Jaguar XJ220]]
| style="text-align:left;"| Originally a JaguarSport plant. After XJ220 production ended, plant was transferred to Aston Martin to build the DB7. Closed with the end of DB7 production in 2003. Aston Martin has since been sold by Ford in 2007.
|- style="vertical-align:top;"
| style="text-align:center;"| V (NA)
| style="text-align:left;"| [[w:International Motors#Blue Diamond Truck|Blue Diamond Truck]]
| style="text-align:left;"| [[w:General Escobedo|General Escobedo, Nuevo León]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"|Joint venture ended in 2015
| style="text-align:left;"|[[w:Ford F-Series (medium duty truck)#Seventh generation (2000-2015)|Ford F-650]] (2004-2015)<br />[[w:Ford F-Series (medium duty truck)#Seventh generation (2000-2015)|Ford F-750]] (2004-2015)<br /> [[w:Ford LCF|Ford LCF]] (2006-2009)
| style="text-align:left;"| Commercial truck joint venture with Navistar until 2015 when Ford production moved back to USA and plant was returned to Navistar.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford India|Bombay Assembly]]
| style="text-align:left;"| [[w:Bombay|Bombay]]
| style="text-align:left;"| [[w:India|India]]
| style="text-align:center;"| 1926-1954
| style="text-align:left;"|
| Ford's original Indian plant.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford France|Bordeaux Assembly]]
| style="text-align:left;"| [[w:Bordeaux|Bordeaux]]
| style="text-align:left;"| [[w:France|France]]
| style="text-align:center;"| Closed 1925
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| Replaced by Asnières-sur-Seine plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Bridgend Engine|Bridgend Engine]]
| style="text-align:left;"| [[w:Bridgend|Bridgend]]
| style="text-align:left;"| [[w:Wales|Wales]], [[w:UK|U.K.]]
| style="text-align:center;"| Closed September 2020
| style="text-align:left;"| [[w:Ford CVH engine|Ford CVH engine]]<br />[[w:Ford Sigma engine|Ford Sigma engine]]<br />[[w:Ford EcoBoost engine#Inline four-cylinder|Ford 1.5/1.6 Sigma EcoBoost I4]]<br />[[w:Ford Zeta engine|Ford Zeta engine]]<br />[[w:Ford EcoBoost engine#1.5 L Dragon|Ford 1.5L Dragon EcoBoost I3]]<br /> [[w:Jaguar AJ-V8 engine|Jaguar AJ-V8 engine]] 4.0/4.2/4.4L<br />[[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 3.0L V6]]<br />[[w:Jaguar AJ-V8 engine#AJ-V8 Gen III|Jaguar AJ133 5.0L V8]]<br /> [[w:Volvo SI6 engine|Volvo SI6 engine]]
|
|- style="vertical-align:top;"
| style="text-align:center;"| JG (AU) /<br> G (AU) /<br> 8 (NA)
| style="text-align:left;"| [[w:Broadmeadows Assembly Plant|Broadmeadows Assembly Plant]] (Broadmeadows Car Assembly) (Plant 1)
| style="text-align:left;"| [[w:Campbellfield|Campbellfield]], [[w:Victoria (Australia)|Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| 1959-2016<ref name="abc_4707960">{{cite news|title=Ford Australia to close Broadmeadows and Geelong plants, 1,200 jobs to go|url=http://www.abc.net.au/news/2013-05-23/ford-to-close-geelong-and-broadmeadows-plants/4707960|work=abc.net.au|access-date=25 May 2013}}</ref>
| style="text-align:left;"| [[w:Ford Consul|Ford Consul]]<br />[[w:Ford Zephyr|Ford Zephyr]]<br />[[w:Ford Zodiac|Ford Zodiac]]<br />[[w:Ford Anglia#Anglia 105E (1959–1968)|Ford Anglia 105E]]<br />[[w:Ford Prefect|Ford Prefect]]<br />[[w:Ford Cortina|Ford Cortina]] TC-TF<br />[[w:Ford Telstar#First generation (AR, AS; 1982–1987)|Ford Telstar]]<br />[[w:Ford Falcon (Australia)|Ford Falcon]]<br /> Ford Falcon Ute<br /> [[w:Nissan Ute|Nissan Ute]] (XFN)<br />Ford Falcon Panel Van<br />[[w:Ford Fairlane (Australia)|Ford Fairlane]]<br />[[w:Ford LTD (Australia)|Ford LTD]]<br /> [[w:Ford Territory (Australia)|Ford Territory]]<br /> [[w:Ford Capri (Australia)|Ford Capri Convertible]]<br />[[w:Mercury Capri#Third generation (1991–1994)|Mercury Capri convertible]] (1991–1994)<br />[[w:1957 Ford|1959-1961 Ford Custom 300/Fairlane 500/Ranch Wagon]]<br />[[w:Ford Galaxie#Australian production|Ford Galaxie (1969-1972) (conversion to right hand drive)]]
| Plant opened August 1959. Closed Oct 7th 2016.
|- style="vertical-align:top;"
| style="text-align:center;"| JL (AU) /<br> L (AU)
| style="text-align:left;"| Broadmeadows Commercial Vehicle Plant (Assembly Plant 2)
| style="text-align:left;"| [[w:Campbellfield|Campbellfield]],[[w:Victoria (Australia)|Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| 1971-1992
| style="text-align:left;"| [[w:Ford F-Series|Ford F-Series]] (F-100/F-150/F-250/F-350)<br />[[w:Ford F-Series (medium duty truck)|Ford F-Series medium duty]] (F-500/F-600/F-700/F-750/F-800/F-8000)<br />[[w:Ford L-Series|Ford L-Series/Louisville/Aeromax]]<br />[[w:Ford Transit#First generation (1965)|Ford Transit]]<br />[[w:Ford Bronco#Australian assembly|Ford Bronco]]
|
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Cadiz Assembly
| style="text-align:left;"| [[w:Cadiz|Cadiz]]
| style="text-align:left;"| [[w:Spain|Spain]]
| style="text-align:center;"| 1920-1923
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| Replaced by Barcelona plant.
|-
| style="text-align:center;"| 8 (SA)
| style="text-align:left;"| [[w:Ford Brasil|Camaçari Plant]]
| style="text-align:left;"| [[w:Camaçari, Bahia|Camaçari, Bahia]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| 2001-2021<ref name="camacari">{{cite web |title=Ford Advances South America Restructuring; Will Cease Manufacturing in Brazil, Serve Customers With New Lineup {{!}} Ford Media Center |url=https://media.ford.com/content/fordmedia/fna/us/en/news/2021/01/11/ford-advances-south-america-restructuring.html |website=media.ford.com |access-date=6 June 2022 |date=11 January 2021}}</ref><ref>{{cite web|title=Rui diz que negociação para atrair nova montadora de veículos para Camaçari está avançada|url=https://destaque1.com/rui-diz-que-negociacao-para-atrair-nova-montadora-de-veiculos-para-camacari-esta-avancada/|website=destaque1.com|access-date=30 May 2022|date=24 May 2022}}</ref>
| [[w:Ford Ka|Ford Ka]]<br /> [[w:Ford Ka|Ford Ka+]]<br /> [[w:Ford EcoSport|Ford EcoSport]]<br /> [[w:List of Ford engines#1.0 L Fox|Fox 1.0L I3 Engine]]
| [[w:Ford Fiesta (fifth generation)|Ford Fiesta & Fiesta Rocam]]<br />[[w:Ford Courier#Brazil (1998–2013)|Ford Courier]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Canton Forge Plant
| style="text-align:left;"| [[w:Canton, Ohio|Canton, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed 1988
|
| Located on Georgetown Road NE.
|-
|
| Casablanca Automotive Plant
| [[w:Casablanca, Chile|Casablanca, Chile]]
| [[w:Chile|Chile]]
| style="text-align:center;" | 1969-1971<ref>{{Cite web |last=U |first=Juan Ignacio Alamos |date=2011-12-06 |title=AUTOS CHILENOS: PLANTA FORD CASABLANCA (1971) |url=https://autoschilenos.blogspot.com/2011/12/planta-ford-casablanca-1971.html |access-date=2022-08-04 |website=AUTOS CHILENOS}}</ref><ref>{{Cite web |title=Reuters Archive Licensing |url=https://reuters.screenocean.com/record/1076777 |access-date=2022-08-04 |website=Reuters Archive Licensing |language=en}}</ref>
| [[w:Ford Falcon (North America)|Ford Falcon]], [[w:Ford F-Series|Ford F-series]], [[w:Ford F-Series (medium duty truck)#Fifth generation (1967-1979)|Ford F-600]]
| Nationalized by the Chilean government.<ref>{{Cite book |last=Trowbridge |first=Alexander B. |title=Overseas Business Reports, US Department of Commerce |date=February 1968 |publisher=US Government Printing Office |edition=OBR 68-3 |location=Washington, D.C. |pages=18 |language=English}}</ref><ref name=":1">{{Cite web |title=EyN: Henry Ford II regresa a Chile |url=http://www.economiaynegocios.cl/noticias/noticias.asp?id=541850 |access-date=2022-08-04 |website=www.economiaynegocios.cl}}</ref>
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Changan Ford Mazda|Changan Ford Mazda Automobile Co.]]
| style="text-align:left;"| [[w:Nanjing|Nanjing]], [[w:Jiangsu|Jiangsu]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| -2012
| style="text-align:left;"| [[w:Ford Fiesta (sixth generation)|Ford Fiesta]]<br />[[w:Mazda2#DE|Mazda 2]]<br />[[w:Mazda 3|Mazda 3]]
| style="text-align:left;"| Joint venture: Chongqing Changan Automobile Co., Ltd. (50%). Ford Motor Company (35%), Mazda Motor Company (15%). JV was divided in 2012 into [[w:Changan Ford|Changan Ford]] and [[w:Changan Mazda|Changan Mazda]]. Changan Mazda took the Nanjing plant while Changan Ford kept the other plants.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Changan Ford Mazda Engine|Changan Ford Mazda Engine Co.]]
| style="text-align:left;"| [[w:Nanjing|Nanjing]], [[w:Jiangsu|Jiangsu]]
| style="text-align:left;"| [[w:China|China]]
| style="text-align:center;"| -2019
| style="text-align:left;"| [[w:Ford Sigma engine|Ford Sigma engine]]<br />[[w:Mazda L engine|Mazda L engine]]<br />[[w:Mazda Z engine|Mazda BZ series 1.3/1.6 engine]]<br />[[w:Skyactiv#Skyactiv-G|Mazda Skyactiv-G 1.5/2.0/2.5]]
| style="text-align:left;"| Joint venture: Chongqing Changan Automobile Co., Ltd. (50%), Ford Motor Company (25%), Mazda Motor Company (25%). Ford sold its stake to Mazda in 2019. Now known as Changan Mazda Engine Co., Ltd. owned 50% by Mazda & 50% by Changan.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Charles McEnearney & Co. Ltd.
| style="text-align:left;"| Tumpuna Road, [[w:Arima|Arima]]
| style="text-align:left;"| [[w:Trinidad and Tobago|Trinidad and Tobago]]
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Cortina|Ford Cortina]], [[w:Ford Laser|Ford Laser]]
| Ford production ended & factory closed in 1990's.
|- style="vertical-align:top;"
|
| [[w:Ford India|Chennai Engine Plant]]
| [[w:Maraimalai Nagar|Maraimalai Nagar]], [[w:Tamil Nadu|Tamil Nadu]]
| [[w:India|India]]
| style="text-align:center;"| 2010–2022 <ref name=":0">{{cite web|date=2021-09-09|title=Ford to stop making cars in India|url=https://www.reuters.com/business/autos-transportation/ford-motor-cease-local-production-india-shut-down-both-plants-sources-2021-09-09/|access-date=2021-09-09|website=Reuters|language=en}}</ref>
| [[w:Ford DLD engine#DLD-415|Ford DLD engine]] (DLD-415/DV5)<br /> [[w:Ford Sigma engine|Ford Sigma engine]]
|
|- style="vertical-align:top;"
| C (NA)<br>/<br> R (EU) [when following M]
| [[w:Ford India|Chennai Vehicle Assembly Plant]]
| [[w:Maraimalai Nagar|Maraimalai Nagar]], [[w:Tamil Nadu|Tamil Nadu]]
| [[w:India|India]]
| style="text-align:center;"| Opened in 1999 <br> Closed in 2022<ref name=":0"/>
| [[w:Ford Endeavour|Ford Endeavour]]<br /> [[w:Ford Fiesta|Ford Fiesta]] 5th & 6th generations<br /> [[w:Ford Figo#First generation (B517; 2010)|Ford Figo]]<br /> [[w:Ford EcoSport#Second generation (B515; 2012)|Ford EcoSport]]<br />[[w:Ford Ikon|Ford Ikon]]<br />[[w:Ford Fusion (Europe)|Ford Fusion]]
|
|- style="vertical-align:top;"
| style="text-align:center;"| N (NA)
| style="text-align:left;"| Chicago SHO Center
| style="text-align:left;"| [[w:Chicago|Chicago]], [[w:Illinois|Illinois]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 2021-2023
| style="text-align:left;"| [[w:Ford Explorer#Sixth generation (U625; 2020)|Ford Explorer]] (2021-2023)<br />[[w:Lincoln Aviator#Second generation (U611; 2020)|Lincoln Aviator]] (2021-2023)
| style="text-align:left;"| 12429 S Burley Ave in Chicago. Located about 1.2 miles away from Ford's Chicago Assembly Plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Cleveland Aluminum Casting Plant
| style="text-align:left;"| [[w:Brook Park, Ohio|Brook Park, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Opened in 2000,<br> Closed in 2003
| style="text-align:left;"| Aluminum engine blocks for 2.3L Duratec 23 I4
|
|- style="vertical-align:top;"
|
| style="text-align:left;"| Cleveland Casting
| style="text-align:left;"| [[w:Brook Park, Ohio|Brook Park, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Opened in 1952,<br>Closed in 2010
| style="text-align:left;"| Iron engine blocks, heads, crankshafts, and main bearing caps
| style="text-align:left;"|Located at 5600 Henry Ford Blvd. (Engle Rd.), immediately to the south of Cleveland Engine Plant 1. Construction 1950, operational 1952 to 2010.<ref>{{cite web|title=Ford foundry in Brook Park to close after 58 years of service|url=http://www.cleveland.com/business/index.ssf/2010/10/ford_foundry_in_brook_park_to.html|website=Cleveland.com|access-date=9 February 2018|date=23 October 2010}}</ref> Demolished 2011.<ref>{{cite web|title=Ford begins plans to demolish shuttered Cleveland Casting Plant|url=http://www.crainscleveland.com/article/20110627/FREE/306279972/ford-begins-plans-to-demolish-shuttered-cleveland-casting-plant|website=Cleveland Business|access-date=9 February 2018|date=27 June 2011}}</ref>
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Cleveland Engine|Cleveland Engine]] #2
| style="text-align:left;"| [[w:Brook Park, Ohio|Brook Park, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Opened in 1955,<br>Closed in 2012
| style="text-align:left;"| [[w:Ford Duratec V6 engine#2.5 L|Ford 2.5L Duratec V6]]<br />[[w:Ford Duratec V6 engine#3.0 L|Ford 3.0L Duratec V6]]<br />[[w:Jaguar AJ-V6 engine|Jaguar AJ-V6 engine]]
| style="text-align:left;"| Located at 18300 Five Points Rd., south of Cleveland Engine Plant 1 and the Cleveland Casting Plant. Opened in 1955. Partially demolished and converted into Forward Innovation Center West. Source of the [[w:Ford 351 Cleveland|Ford 351 Cleveland]] V8 & the [[w:Ford 335 engine#400|Cleveland-based 400 V8]] and the closely related [[w:Ford 335 engine#351M|400 Cleveland-based 351M V8]]. Also, [[w:Ford Y-block engine|Ford Y-block engine]] & [[w:Ford Super Duty engine|Ford Super Duty engine]].
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Compañía Colombiana Automotriz|Compañía Colombiana Automotriz]] (Mazda)
| style="text-align:left;"| [[w:Bogotá|Bogotá]]
| style="text-align:left;"| [[w:Colombia|Colombia]]
| style="text-align:center;"| Ford production ended. Mazda closed the factory in 2014.
| style="text-align:left;"| [[w:Ford Laser#Latin America|Ford Laser]]<br />[[w:Mazda 323|Mazda 323]]<br />[[w:Ford Ranger (international)|Ford Ranger]]<br />[[w:Mazda B series|Mazda B series]]<br />[[w:Mazda BT-50#First generation (UN; 2006)|Mazda BT-50]]
| style="text-align:left;"| Plant owned by Mazda.
|- style="vertical-align:top;"
| style="text-align:center;"| E (EU) [when following C]
| style="text-align:left;"| [[w:Henry Ford & Sons Ltd|Henry Ford & Sons Ltd]]
| style="text-align:left;"| Marina, [[w:Cork (city)|Cork]]
| style="text-align:left;"| [[w:Munster|Munster]], [[w:Republic of Ireland|Ireland]]
| style="text-align:center;"| Closed (1984)
| style="text-align:left;"| [[w:Fordson|Fordson]] tractor (1919-1922, 1929-1932) and car assembly, including [[w:Ford Escort (Europe)|Ford Escort]] and [[w:Ford Cortina|Ford Cortina]] in the 1970s finally ending with the [[w:Ford Sierra|Ford Sierra]] in 1980s.<ref>{{cite web|title=The history of Ford in Ireland|url=http://www.ford.ie/AboutFord/CompanyInformation/HistoryOfFord|work=Ford|access-date=10 July 2012}}</ref> Also [[w:Ford Transit|Ford Transit]], [[w:Ford A series|Ford A-series]], and [[w:Ford D Series|Ford D-Series]]. Also [[w:Ford Model T|Ford Model T]] (1923-1927), [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:Ford Model Y|Ford Model Y]], [[w:Ford Anglia|Ford Anglia]], [[w:Ford Corsair|Ford Corsair]], [[w:Ford Consul|Ford Consul]], [[w:Ford Prefect|Ford Prefect]], and [[w:Ford Zephyr|Ford Zephyr]].
| style="text-align:left;"| Founded in 1917 with production from 1919 to 1984. Produced Model T components beginning in 1921 before complete cars began to be assembled (Model T in 1923). Supplied components to the Manchester, England Model T plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Croydon Stamping
| style="text-align:left;"| [[w:Croydon|Croydon]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (2003)
| style="text-align:left;"| Parts - Small metal stampings and assemblies
| Opened in 1949 as Briggs Motor Bodies & purchased by Ford in 1957. Expanded in 1989. Site completely vacated in 2005.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Cuautitlán Engine
| style="text-align:left;"| [[w:Cuautitlán Izcalli|Cuautitln Izcalli]], [[w:Mexico State|Mexico State]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| Closed
| style="text-align:left;"| Opened in 1964. Included a foundry and machining plant. <br /> [[w:Ford small block engine#289|Ford 289 V8]]<br />[[w:Ford small block engine#302|Ford 302 V8]]<br />[[w:Ford small block engine#351W|Ford 351 Windsor V8]]
|
|- style="vertical-align:top;"
| style="text-align:center;"| A (EU) [when following B]
| style="text-align:left;"| [[w:Ford Dagenham assembly plant|Dagenham Assembly]]
| style="text-align:left;"| [[w:Dagenham|Dagenham]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (2002)
| style="text-align:left;"| [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model Y|Ford Model Y]], [[w:Ford Model C Ten|Ford Model C Ten]], [[w:Ford CX|Ford CX]], [[w:Ford 7W|Ford 7W]], [[w:Ford 7Y|Ford 7Y]], [[w:Ford Model 91|Ford Model 91]], [[w:Ford Pilot|Ford Pilot]], [[w:Ford Anglia|Ford Anglia]], [[w:Ford Prefect|Ford Prefect]], [[w:Ford Popular|Ford Popular]], [[w:Ford Squire|Ford Squire]], [[w:Ford Consul|Ford Consul]], [[w:Ford Zephyr|Ford Zephyr]], [[w:Ford Zodiac|Ford Zodiac]], [[w:Ford Consul Classic|Ford Consul Classic]], [[w:Ford Corsair|Ford Corsair]], [[w:Ford Cortina|Ford Cortina]], [[w:Ford Granada (Europe)|Ford Granada]], [[w:Ford Fiesta|Ford Fiesta]], [[w:Ford Sierra|Ford Sierra]], [[w:Ford Courier#Europe (1991–2002)|Ford Courier]], [[w:Ford Fiesta (fourth generation)#Mazda 121|Mazda 121]], [[w:Fordson E83W|Fordson E83W]], [[w:Thames (commercial vehicles)#Fordson 7V|Fordson 7V]], [[w:Fordson WOT|Fordson WOT]], [[w:Thames (commercial vehicles)#Fordson Thames ET|Fordson Thames ET]], [[w:Ford Thames 300E|Ford Thames 300E]], [[w:Ford Thames 307E|Ford Thames 307E]], [[w:Ford Thames 400E|Ford Thames 400E]], [[w:Thames Trader|Thames Trader]], [[w:Thames Trader#Normal Control models|Thames Trader NC]], [[w:Thames Trader#Normal Control models|Ford K-Series]]
| style="text-align:left;"| 1931–2002, formerly principal Ford UK plant
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Dagenham|Dagenham Stamping & Tooling]]
| style="text-align:left;"| [[w:Dagenham|Dagenham]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (2013)<ref name="End of an era">{{cite news|title=End of an era|url=https://www.bbc.co.uk/news/uk-england-20078108|work=BBC News|access-date=26 October 2012}}</ref> Demolished.
| Body panels, wheels
|
|- style="vertical-align:top;"
| style="text-align:center;"| DS/DL/D (NA)
| style="text-align:left;"| Dallas Assembly Plant
| style="text-align:left;"| [[w:Dallas|Dallas, TX]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1925 to 1970
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:Ford Model 48|Ford Model 48]]<br />[[w:1937 Ford|1937 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />[[w:Ford GPW|Ford GPW]] (93,748 units)<ref>{{cite web|title=Arsenal of Democracy; The American Automobile Industry in World War II|date=2013 |url=https://www.google.com/books/edition/Arsenal_of_Democracy/P-PCAgAAQBAJ?hl=en&gbpv=1&pg=PA150&printsec=frontcover|author=Charles K. Hyde|publisher=Wayne State University Press|page=150-151}}</ref><br />[[w:1949 Ford|1949 Ford]]<br />[[w:1952 Ford|1952 Ford]]<br />[[w:1955 Ford|1955 Ford]]<br />[[w:1957 Ford|1957 Ford]]<br />[[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1960) <br />[[w:Ford Galaxie|Ford Galaxie]] (1959-1969)<br />[[w:Ford 300|Ford 300]] (1963)<br />[[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1968)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1968)<br />[[w:Ford F-Series|Ford F-Series]] (1951-1970)
| style="text-align:left;"| Located at 5200 E. Grand Ave. near Fair Park. Replaced original Dallas plant at 2700 Canton St. in 1925. Assembly stopped February 1933 but resumed in 1934. Closed February 20, 1970. Over 3 million vehicles built. 5200 E. Grand Ave. is now owned by City Warehouse Corp. and is used by multiple businesses.
|- style="vertical-align:top;"
| style="text-align:center;"| DA/F (NA)
| style="text-align:left;"| [[w:Dearborn Assembly Plant|Dearborn Assembly Plant]]
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (2004)
| style="text-align:left;"| [[w:Eagle-class patrol craft|Eagle-class patrol craft]] during WWI<br />[[w:Fordson|Fordson]] tractors (1921-1928) <br />Parts for Ford Model T<br />[[w:Ford Model A (1927–1931)|Ford Model A]] (1928-1932)<br />[[w:Ford Model B (1932)|Ford Model B]] (1932-1934)<br />[[w:Ford Model 48|Ford Model 48]] (1935-1936)<br />[[w:1937 Ford|1937 Ford]] (1937-1940)<br />[[w:1941 Ford|1941 Ford]] (1941-1942, 1946-1948)<br />[[w:1949 Ford|1949 Ford]] (1949-1951)<br />[[w:1952 Ford|1952 Ford]] (1952-1954)<br />[[w:1955 Ford|1955 Ford]] (1955-1956)<br />[[w:1957 Ford|1957 Ford]] (1957-1959)<br />[[w:Mercury Eight|Mercury Eight]] (1939-1951)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1955-1961)<br /> [[w:Ford Galaxie|Ford Galaxie]] (1959-1960)<br /> [[w:Ford Ranchero|Ford Ranchero]] (1957-1958)<br /> [[w:Ford Fairlane (Americas)|Ford Fairlane (midsize)]] (1962-1964)<br /> [[w:Mercury Meteor#Intermediate (1962–1963)|Mercury Meteor]] (1962-1963)<br />[[w:Ford Thunderbird (first generation)|Ford Thunderbird]] (1955-1957)<br />[[w:Ford Mustang|Ford Mustang]] (1965-2004)<br />[[w:Mercury Cougar|Mercury Cougar]] (1967-1973)<br />[[w:Mercury Capri#Second generation (1979–1986)|Mercury Capri]] (1979-1986)<br />[[w:Ford Falcon (North America)|Ford Falcon]] (1966)<br />[[w:Ford Maverick (1970–1977)|Ford Maverick]] (1972-1973)<br />[[w:Mercury Comet#Fifth generation (1971–1977)|Mercury Comet]] (1972-1973)<br />[[w:Ford GPW|Ford GPW]] (21,559 units)<ref>{{cite web|title=Arsenal of Democracy; The American Automobile Industry in World War II|date=2013 |url=https://www.google.com/books/edition/Arsenal_of_Democracy/P-PCAgAAQBAJ?hl=en&gbpv=1&pg=PA150&printsec=frontcover|author=Charles K. Hyde|publisher=Wayne State University Press|page=150-151}}</ref> <br>[[w:Ford GPA|Ford GPA]] 'Seep' (Sea Jeep)
| style="text-align:left;"| Part of the River Rouge Complex. Started building Eagle-class patrol boats in 1918 during World War I. After the war ended, builtt Fordson tractors and parts for the Model T but didn't assemble any complete Model Ts. The Model A was the first complete car built at the Rouge complex. During World War II, the Rouge complex produced Jeeps (GPW), aircraft engines and engine parts, aircraft components, tires and tubes, armor plating, and tractors. During 2004, Mustangs built at Dearborn Assembly and F-150s built at Dearborn Truck were painted in the same new paint shop that opened in 2000. On May 10, 2004, the final vehicle was built at Dearborn Assembly: a '04 Mustang GT convertible. Replaced by Dearborn Truck Plant for 2005MY. This plant within the Rouge complex was demolished in 2008. It is now a parking lot to hold trucks from the Dearborn Truck Plant.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Dearborn Iron Foundry
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1974)
| style="text-align:left;"| Cast iron parts including engine blocks.
| style="text-align:left;"| Part of the River Rouge Complex. Replaced by Michigan Casting Center in the early 1970s.
|- style="vertical-align:top;"
| style="text-align:center;"| H (AU)
| style="text-align:left;"| Eagle Farm Assembly Plant
| style="text-align:left;"| [[w:Eagle Farm, Queensland|Eagle Farm (Brisbane), Queensland]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed (1998)
| style="text-align:left;"| [[w:Ford Falcon (Australia)|Ford Falcon]]<br />Ford Falcon Ute (including XY 4x4)<br />[[w:Ford Fairlane (Australia)|Ford Fairlane]]<br />[[w:Ford LTD (Australia)|Ford LTD]]<br /> [[w:Ford F-Series|Ford F-Series]] trucks<br />[[w:Ford L-Series|Ford L-Series/Louisville/Aeromax trucks]]<br />[[w:Ford Cargo|Ford Cargo]]<br />[[w:Ford Trader|Ford Trader]]
| style="text-align:left;"| Opened in 1926. Closed in 1998; demolished
|- style="vertical-align:top;"
| style="text-align:center;"| ME/T (NA)
| style="text-align:left;"| [[w:Edison Assembly|Edison Assembly]] (a.k.a. Metuchen Assembly)
| style="text-align:left;"|[[w:Edison, New Jersey|Edison, New Jersey]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1948–2004
| style="text-align:left;"| [[w:Ford Ranger (Americas)|Ford Ranger]] (1991-2004)<br />[[w:Ford Ranger EV|Ford Ranger EV]] (1998-2001)<br />[[w:Ford Ranger (Americas)#Mazda B-Series/Mazda Truck (1994–2010)|Mazda B-Series]] (1994–2004)<br />[[w:Ford Escort (North America)|Ford Escort]] (1981-1990)<br />[[w:Mercury Lynx|Mercury Lynx]] (1981-1987)<br />[[w:Ford Mustang|Ford Mustang]] (1965-1971)<br />[[w:Mercury Cougar|Mercury Cougar]]<br />[[w:Ford Pinto|Ford Pinto]] (1971-1980)<br />[[w:Mercury Bobcat|Mercury Bobcat]] (1975-1980)<br />[[w:Ford Falcon (North America)|Ford Falcon]] (1960-1965)<br />[[w:Mercury Comet|Mercury Comet]] (1963-1965)<br />[[w:Mercury Custom|Mercury Custom]]<br />[[w:Mercury Eight|Mercury Eight]] (1950-1951)<br />[[w:Mercury Medalist|Mercury Medalist]] (1956)<br />[[w:Mercury Montclair|Mercury Montclair]] (1955-1959)<br />[[w:Mercury Monterey|Mercury Monterey]] (1952-1959)<br />[[w:Mercury Park Lane|Mercury Park Lane]] (1959-1960)<br />[[w:Mercury Turnpike Cruiser|Mercury Turnpike Cruiser]]<br />[[w:Mercury Meteor#Full-size (1961)|Mercury Meteor]] <br /> [[w:Mercury Commuter|Mercury Commuter]] (1958)
| style="text-align:left;"| Located at 939 U.S. Route 1. Demolished in 2005. Now a shopping mall called Edison Towne Square. Also known as Metuchen Assembly.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Essex Aluminum|Essex Aluminum]]
| style="text-align:left;"| [[w:Windsor, Ontario|Windsor, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| Closed (2012)
| style="text-align:left;"| 3.8/4.2L V6 cylinder heads<br />4.6L, 5.4L V8 cylinder heads<br />6.8L V10 cylinder heads<br />Pistons
| style="text-align:left;"| Opened 1981. Sold to Nemak Aluminum (a 25/75 joint venture between Ford & Nemak, which is 75.24% owned by Alfa Group of Mexico) in 2001; shuttered in 2009 except for the melting operation which closed in 2012.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Fairfax Transmission
| style="text-align:left;"| [[w:Fairfax, Ohio|Fairfax, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1979)
| style="text-align:left;"| [[w:Cruise-O-Matic|Ford-O-Matic/Merc-O-Matic/Lincoln Turbo-Drive]]<br /> [[w:Cruise-O-Matic#MX/FX|Cruise-O-Matic (FX transmission)]]<br />[[w:Cruise-O-Matic#FMX|FMX transmission]]
| Located at 4000 Red Bank Road. Opened in 1950. Original Ford-O-Matic was a licensed design from the Warner Gear division of [[w:Borg-Warner|Borg-Warner]]. Also produced aircraft engine parts during the Korean War. Closed in 1979. Sold to Red Bank Distribution of Cincinnati in 1987. Transferred to Cincinnati Port Authority in 2006 after Cincinnati agreed not to sue the previous owner for environmental and general negligence. Redeveloped into Red Bank Village, a mixed-use commercial and office space complex, which opened in 2009 and includes a Wal-Mart.
|- style="vertical-align:top;"
| style="text-align:center;"| T (EU) [when following L] (for Ford),<br> J (for Fiat - later years)
| style="text-align:left;"| [[w:FCA Poland|Fiat Tychy Assembly]]
| style="text-align:left;"| [[w:Tychy|Tychy]]
| style="text-align:left;"| [[w:Poland|Poland]]
| style="text-align:center;"| Ford production ended in 2016
| [[w:Ford Ka#Second generation (2008)|Ford Ka]]<br />[[w:Fiat 500 (2007)|Fiat 500]]
| Plant owned by [[w:Fiat|Fiat]], which is now part of [[w:Stellantis|Stellantis]]. Production for Ford began in 2008.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Foden Trucks|Foden Trucks]]
| style="text-align:left;"| [[w:Sandbach|Sandbach]], [[w:Cheshire|Cheshire]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Ford production ended in 1984. Factory closed in 2000.
| style="text-align:left;"| [[w:Ford Transcontinental|Ford Transcontinental]]
| style="text-align:left;"| Foden Trucks plant. Produced for Ford after Ford closed Amsterdam plant. 504 units produced by Foden.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Ford Malaysia Sdn. Bhd
| style="text-align:left;"| [[w:Selangor|Selangor]]
| style="text-align:left;"| [[w:Malaysia|Malaysia]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Laser|Ford Laser]]<br />[[w:Ford Lynx|Ford Lynx]]<br /> [[w:Ford Telstar|Ford Telstar]]<br />[[w:Ford Escape#First generation (2001)|Ford Escape]]<br /> [[w:Ford Ranger (international)|Ford Ranger]]<br /> [[w:Ford Econovan|Ford Econovan]]<br />[[w:Ford Spectron|Ford Spectron]]<br /> [[w:Ford Trader|Ford Trader]]<br />[[w:BMW 3-Series|BMW 3-Series]] E46, E90<br />[[w:BMW 5-Series|BMW 5-Series]] E60<br />[[w:Land Rover Defender|Land Rover Defender]]<br /> [[w:Land Rover Discovery|Land Rover Discovery]]
| style="text-align:left;"|Originally known as AMIM (Associated Motor Industries Malaysia) Holdings Sdn. Bhd. which was 30% owned by Ford from the early 1980s. Previously, Associated Motor Industries Malaysia had assembled for various automotive brands including Ford but was not owned by Ford. In 2000, Ford increased its stake to 49% and renamed the company Ford Malaysia Sdn. Bhd. The other 51% was owned by Tractors Malaysia Bhd., a subsidiary of Sime Darby Bhd.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Motor Company Lamp Factory|Ford Motor Company Lamp Factory]]
| style="text-align:left;"| [[w:Flat Rock, Michigan|Flat Rock, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1950)
| style="text-align:left;"| Automotive lighting
| Located at 26601 W. Huron River Drive. Opened in 1923. Also produced junction boxes for the B-24 bomber as well as lighting for military vehicles during World War II. Closed in 1950. Sold to Moynahan Bronze Company in 1950. Sold to Stearns Manufacturing in 1972. Leased in 1981 to Flat Rock Metal Inc., which later purchased the building.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Motor Company Philippines#History|Ford Philippines, Inc.]] Assembly Plant
| style="text-align:left;"| [[w:Sucat, Muntinlupa|Sucat]], [[w:Muntinlupa|Muntinlupa]]
| style="text-align:left;"| [[w:Philippines|Philippines]]
| style="text-align:center;"| Closed (August 1984)
| style="text-align:left;"| [[w:Ford Cortina|Ford Cortina]]<br /> [[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Taunus|Ford Taunus]]<br /> [[w:Ford Galaxie|Ford Galaxie]]<br />[[w:Ford LTD (Americas)|Ford LTD]]<br />[[w:Ford Laser#First generation (KA/KB; 1981)|Ford Laser]]<br />[[w:Ford Telstar#First generation (AR, AS; 1982–1987)|Ford Telstar]]<br /> American Ford trucks<br />British Ford trucks<br />Ford Fiera
| style="text-align:left;"| Plant opened 1968.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Motor Company Philippines#History|Ford Philippines, Inc.]] Stamping Plant
| style="text-align:left;"| [[w:Mariveles|Mariveles]], [[w:Bataan|Bataan]]
| style="text-align:left;"| [[w:Philippines|Philippines]]
| style="text-align:center;"| Closed (August 1984)
| style="text-align:left;"| Stampings
| style="text-align:left;"| Plant opened 1976.
|- style="vertical-align:top;"
| style="text-align:left;"|
| style="text-align:left;"| [[w:Ford Italia|Ford Motor Co. d’Italia]]
| style="text-align:left;"| [[w:Trieste|Trieste]]
| style="text-align:left;"| [[w:Italy|Italy]]
| style="text-align:center;"| Closed (1931)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]] <br />[[w:Fordson|Fordson]] tractors
| style="text-align:left;"|
|- style="vertical-align:top;"
| style="text-align:left;"|
| style="text-align:left;"| [[w:Ford Motor Company of Japan|Ford Motor Company of Japan]]
| style="text-align:left;"| [[w:Yokohama|Yokohama]], [[w:Kanagawa Prefecture|Kanagawa Prefecture]]
| style="text-align:left;"| [[w:Japan|Japan]]
| style="text-align:center;"| Closed (1941)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932-1934 Ford]]<br />[[w:Ford Model Y|Ford Model Y]]
| style="text-align:left;"| Founded in 1925. Factory was seized by Imperial Japanese Government.
|- style="vertical-align:top;"
| style="text-align:left;"| T
| style="text-align:left;"| Ford Motor Company del Peru
| style="text-align:left;"| [[w:Lima|Lima]]
| style="text-align:left;"| [[w:Peru|Peru]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Mustang (first generation)|Ford Mustang (first generation)]]<br /> [[w:Ford Galaxie|Ford Galaxie]]<br />[[w:Ford Taunus|Ford Taunus]] 17M<br />[[w:Ford F-Series|Ford F-Series]]
| style="text-align:left;"| Opened in 1965.<ref>{{Cite news |date=1964-07-28 |title=Ford to Assemble Cars In Big New Plant in Peru |language=en-US |work=The New York Times |url=https://www.nytimes.com/1964/07/28/archives/ford-to-assemble-cars-in-big-new-plant-in-peru.html |access-date=2022-11-05 |issn=0362-4331}}</ref><ref>{{Cite web |date=2017-06-22 |title=Ford del Perú |url=https://archivodeautos.wordpress.com/2017/06/22/ford-del-peru/ |access-date=2022-11-05 |website=Archivo de autos |language=es}}</ref>
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Motor Company Philippines|Ford Motor Company Philippines]]
| style="text-align:left;"| [[w:Santa Rosa, Laguna|Santa Rosa, Laguna]]
| style="text-align:left;"| [[w:Philippines|Philippines]]
| style="text-align:center;"| Closed (December 2012)
| style="text-align:left;"| [[w:Ford Lynx|Ford Lynx]]<br /> [[w:Ford Focus|Ford Focus]]<br /> [[w:Mazda Protege|Mazda Protege]]<br />[[w:Mazda 3|Mazda 3]]<br /> [[w:Ford Escape|Ford Escape]]<br /> [[w:Mazda Tribute|Mazda Tribute]]<br />[[w:Ford Ranger (international)#First generation (PE/PG/PH; 1998)|Ford Ranger]]
| style="text-align:left;"| Plant sold to Mitsubishi Motors
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Ford Motor Company Caribbean, Inc.
| style="text-align:left;"| [[w:Canóvanas, Puerto Rico|Canóvanas]], [[w:Puerto Rico|Puerto Rico]]
| style="text-align:left;"| [[w:United States|U.S.]]
| style="text-align:center;"| Closed
| style="text-align:left;"| Ball bearings
| Plant opened in the 1960s. Constructed on land purchased from the [[w:Puerto Rico Industrial Development Company|Puerto Rico Industrial Development Company]].
|- style="vertical-align:top;"
| style="text-align:center;"| M (EU) [when following C]
| style="text-align:left;"| [[w:de:Ford Motor Company of Rhodesia|Ford Motor Co. Rhodesia (Pvt.) Ltd.]]
| style="text-align:left;"| [[w:Willowvale, Harare|Willowvale]], [[w:Harare|Salisbury]] (now Harare)
| style="text-align:left;"| ([[w:Southern Rhodesia|Southern Rhodesia]]) / [[w:Rhodesia (1964–1965)|Rhodesia (colony)]] / [[w:Rhodesia|Rhodesia (country)]] (now [[w:Zimbabwe|Zimbabwe]])
| style="text-align:center;"| Sold in 1967 to state-owned Industrial Development Corporation
| style="text-align:left;"| [[w:Ford Fairlane (Americas)#Fourth generation (1962–1965)|Ford Fairlane]]<br />[[w:Ford Fairlane (Americas)#Fifth generation (1966–1967)|Ford Fairlane]]<br />[[w:Ford Falcon (North America)|Ford Falcon]]<br />[[w:Ford F-Series (fourth generation)|Ford F-100]]<br />[[w:Ford Galaxie|Ford Galaxie]]<br />[[w:Ford Anglia|Ford Anglia]]<br />[[w:Ford Consul#Ford Consul Mark II (1956–1962)|Ford Consul]]<br />[[w:Ford Consul Classic|Ford Consul Classic]]<br />[[w:Ford Corsair|Ford Corsair]]<br />[[w:Ford Cortina|Ford Cortina]]<br />[[w:Ford Zephyr|Ford Zephyr]]<br />[[w:Ford Zodiac|Ford Zodiac]]<br />[[w:Ford Thames 400E|Ford Thames 400E/800]]<br />[[w:Thames Trader|Thames Trader]]<br />[[w:Ford Taunus P3|Ford Taunus P3]]<br />[[w:Ford Taunus P5|Ford Taunus P5]]<br />[[w:Ford Transit#Taunus Transit (1953)|Ford Taunus Transit]]<br />[[w:Fordson#Dexta|Fordson Dexta tractors]]<br />[[w:Fordson#E1A|Fordson Super Major]]<br />[[w:Deutz-Fahr|Deutz F1M 414 tractor]]
| style="text-align:left;"| Assembly began in 1961. Became [[w:Willowvale Motor Industries|Willowvale Motor Industries]] after the Ford sale. Became Willowvale Mazda Motor Industries from 1989 to 2014. Name went back to [[w:Willowvale Motor Industries|Willowvale Motor Industries]] in 2015.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Former Ford Factory|Ford Motor Co. (Singapore)]]
| style="text-align:left;"| [[w:Bukit Timah|Bukit Timah]]
| style="text-align:left;"| [[w:Singapore|Singapore]]
| style="text-align:center;"| Closed (1980)
| style="text-align:left;"| [[w:Ford Anglia|Ford Anglia]]<br />[[w:Ford Consul#Ford Consul Mark II (1956–1962)|Ford Consul]]<br />[[w:Ford Custom|Ford Custom]]<br />[[w:Ford Corsair|Ford Corsair]]<br />[[w:Ford Cortina|Ford Cortina]]<br /> [[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Falcon (Australia)|Ford Falcon]]<br />[[w:Ford Granada (Europe)|Ford Granada]]<br />[[w:Ford Prefect|Ford Prefect]]<br />[[w:Ford Zephyr|Ford Zephyr]]<br />[[w:Ford Zodiac|Ford Zodiac]]
| style="text-align:left;"|Originally known as Ford Motor Company of Malaya Ltd. & subsequently as Ford Motor Company of Malaysia. Factory was originally on Anson Road, then moved to Prince Edward Road in Jan. 1930 before moving to Bukit Timah Road in April 1941. Factory was occupied by Japan from 1942 to 1945 during World War II. It was then used by British military authorities until April 1947 when it was returned to Ford. Production resumed in December 1947.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Motor Company of Southern Africa|Ford Motor Company of South Africa Ltd.]] Struandale Assembly Plant
| style="text-align:left;"| Struandale, [[w:Port Elizabeth|Port Elizabeth]]
| style="text-align:left;"| [[w:South Africa|South Africa]]
| style="text-align:center;"| Sold to [[w:Delta Motor Corporation|Delta Motor Corporation]] (later [[w:General Motors South Africa|GM South Africa]]) in 1994
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:Ford Falcon (North America)|Ford Falcon (North America)]]<br />[[w:Ford Fairlane (Americas)|Ford Fairlane (Americas)]]<br />[[w:Ford Galaxie|Ford Galaxie]]<br />[[w:Ford Ranchero#First generation (1957–1959)|Ford Ranchero (American)]]<br />[[w:Ford Anglia|Ford Anglia]]<br />[[w:Ford Prefect|Ford Prefect]]<br />[[w:Ford Capri|Ford Capri]]<br />[[w:Ford Cortina|Ford Cortina]]<br />[[w:Ford P100#Cortina-based model|Ford Cortina Pickup/P100/Ford 1-Tonner]]<br />[[w:Ford Zephyr|Ford Zephyr]]<br />[[w:Ford Zodiac|Ford Zodiac]]<br />[[w:Ford Taunus P3|Ford Taunus P3]]<br />[[w:Ford Taunus P5|Ford Taunus (P5) 17M]]<br />[[w:Ford P7|Ford (Taunus P7) 17M/20M]]<br />[[w:Ford Granada (Europe)#Mark I (1972–1977)|Ford Granada]]<br />[[w:Ford Fairmont (Australia)#South Africa|Ford Fairmont/Fairmont GT]] (XW, XY)<br />[[w:Ford Ranchero|Ford Ranchero]] ([[w:Ford Falcon (Australia)#Falcon utility|Falcon Ute-based]]) (XT, XW, XY, XA, XB)<br />[[w:Ford Fairlane (Australia)#Second generation|Ford Fairlane (Australia)]]<br />[[w:Ford Escort (Europe)|Ford Escort/XR3/XR3i]]<br />[[w:Ford Bantam|Ford Bantam]]<br />[[w:Ford Transit#First generation (1965)|Ford Transit]]
| Ford first began production in South Africa in 1924 in a former wool store on Grahamstown Road in Port Elizabeth. Ford then moved to a larger location on Harrower Road in October 1930. In 1948, Ford moved again to a plant in Neave Township, Port Elizabeth. Struandale Assembly opened in 1974. Ford ended vehicle production in Port Elizabeth in December 1985, moving all vehicle production to SAMCOR's Silverton plant that had come from Sigma Motor Corp., the other partner in the [[w:SAMCOR|SAMCOR]] merger.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Sollers|Ford Sollers]] Naberezhny Chelny Assembly Plant
| style="text-align:left;"| [[w:Naberezhny Chelny|Naberezhny Chelny]]
| style="text-align:left;"| [[w:Russia|Russia]]
| style="text-align:center;"| Closed (2019), JV with 50% owned by Sollers
| style="text-align:left;"| [[w:Ford EcoSport#Second generation (B515; 2012)|Ford EcoSport]]<br /> [[w:Ford Fiesta (sixth generation)|Ford Fiesta]]
| Became part of the 50/50 Ford Sollers joint venture in 2011. Closed in 2019 when Ford discontinued its passenger vehicle portfolio in Russia. Ford Sollers was dissolved in 2022.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Sollers|Ford Sollers]] St. Petersburg Assembly Plant, previously [[w:Ford Motor Company ZAO|Ford Motor Company ZAO]]
| style="text-align:left;"| [[w:Vsevolozhsk|Vsevolozhsk]], [[w:Leningrad Oblast|Leningrad Oblast]]
| style="text-align:left;"| [[w:Russia|Russia]]
| style="text-align:center;"| Closed (2019), JV with 50% owned by Sollers
| style="text-align:left;"| [[w:Ford Focus|Ford Focus]]<br /> [[w:Ford Mondeo|Ford Mondeo]]
| Opened as a 100%-owned Ford plant in 2002 building the Focus. Mondeo was added in 2009. Became part of the 50/50 Ford Sollers joint venture in 2011. Closed in 2019 when Ford discontinued its passenger vehicle portfolio in Russia. Ford Sollers was dissolved in 2022.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Sollers|Ford Sollers]] Yelabuga Assembly Plant
| style="text-align:left;"| [[w:Yelabuga|Yelabuga]]
| style="text-align:left;"| [[w:Russia|Russia]]
| style="text-align:center;"| Sold (2022). Became part of the 50/50 Ford Sollers joint venture in 2011. Restructured & renamed Sollers Ford in 2020 after Sollers increased its stake to 51% in 2019 with Ford owning 49%. Production suspended in March 2022. Ford Sollers was dissolved in October 2022 when Ford sold its remaining 49% stake and exited the Russian market.
| style="text-align:left;"| [[w:Ford Transit#Fourth generation (2014)|Ford Transit]]
| Previously: [[w:Ford Explorer#Fifth generation (U502; 2011)|Ford Explorer]]<br />[[w:Ford Galaxy#Second generation (2006)|Ford Galaxy]]<br />[[w:Ford Kuga#Second generation (C520; 2012)|Ford Kuga]]<br />[[w:Ford S-Max#First generation (2006)|Ford S-Max]]<br />[[w:Ford Transit Custom#First generation (2012)|Ford Transit Custom]]<br />[[w:Ford Tourneo Custom#First generation (2012)|Ford Tourneo Custom]]<br />[[w:Ford Transit#Third generation (2000)|Ford Transit]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Sollers|Ford Sollers]] Yelabuga Engine Plant
| style="text-align:left;"| [[w:Yelabuga|Yelabuga]]
| style="text-align:left;"| [[w:Russia|Russia]]
| style="text-align:center;"| Closed (2019), JV with 50% owned by Sollers
| style="text-align:left;"| [[w:Ford Sigma engine|Ford 1.6L Duratec I4]]
| Opened as part of the 50/50 Ford Sollers joint venture in 2015. Closed in 2019 when Ford discontinued its passenger vehicle portfolio in Russia. Ford Sollers was dissolved in 2022.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Union|Ford Union]]
| style="text-align:left;"| [[w:Apčak|Obchuk]]
| style="text-align:left;"| [[w:Belarus|Belarus]]
| style="text-align:center;"| Closed (2000)
| [[w:Ford Escort (Europe)#Sixth generation (1995–2002)|Ford Escort, Escort Van]]<br />[[w:Ford Transit|Ford Transit]]
| Ford Union was a joint venture which was 51% owned by Ford, 23% owned by distributor Lada-OMC, & 26% owned by the Belarus government. Production began in 1997.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford-Vairogs|Ford-Vairogs]]
| style="text-align:left;"| [[w:Riga|Riga]]
| style="text-align:left;"| [[w:Latvia|Latvia]]
| style="text-align:center;"| Closed (1940). Nationalized following Soviet invasion & takeover of Latvia.
| [[w:Ford Prefect#E93A (1938–49)|Ford-Vairogs Junior]]<br />[[w:Ford Taunus G93A#Ford Taunus G93A (1939–1942)|Ford-Vairogs Taunus]]<br />[[w:1937 Ford|Ford-Vairogs V8 Standard]]<br />[[w:1937 Ford|Ford-Vairogs V8 De Luxe]]<br />Ford-Vairogs V8 3-ton trucks<br />Ford-Vairogs buses
| Produced vehicles under license from Ford's Copenhagen, Denmark division. Production began in 1937.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Fremantle Assembly Plant
| style="text-align:left;"| [[w:North Fremantle, Western Australia|North Fremantle, Western Australia]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 1987
| style="text-align:left;"| [[w:Ford Model A (1927–1931)| Ford Model A]] <br /> [[w:1932 Ford|1932 Ford]] <br /> [[w:Ford Model 48|Ford Model 48]]<br>[[w:1937 Ford|1937 Ford]]<br>[[w:Ford Anglia|Ford Anglia]]<br>[[w:Ford Prefect|Ford Prefect]] <br>Ford trucks <br> Ford tractors
| style="text-align:left;"| Located at 130 Stirling Highway. Plant opened in March 1930. In the 1970’s and 1980’s the factory was assembling tractors and rectifying vehicles delivered from Geelong in Victoria. The factory was also used as a depot for spare parts for Ford dealerships. Later used by Matilda Bay Brewing Company from 1988-2013 though beer production ended in 2007.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Geelong Assembly
| style="text-align:left;"| [[w:Norlane, Victoria|Norlane, Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:Ford Model Y|Ford Model Y]]<br />[[w:Ford Model C Ten|Ford Model C Ten]]<br />[[w:1932 Ford|1932-1934 Ford]]<br />[[w:Ford Model 48|Ford Model 48/Model 68]]<br />[[w:1937 Ford|1937-1940 Ford]]<br />[[w:Mercury Eight|Mercury Eight]] (through 1948)<br />[[w:Ford Prefect|Ford Prefect]]<br />[[w:Ford Anglia|Ford Anglia]]<br />[[w:1941 Ford#Australian production|1941-1942 & 1946-1948 Ford]]<br />[[w:Ford Pilot|Ford Pilot]]<br />[[w:Ford Consul|Ford Consul]]<br />[[w:Ford Zephyr|Ford Zephyr]]<br />[[w:Ford Zodiac|Ford Zodiac]]<br />[[w:1949 Ford|1949-1951 Ford Custom Fordor/Coupe Utility/Deluxe Coupe Utility]]<br />[[w:1952 Ford|1952-1954 Ford Customline sedan/Mainline Coupe Utility]]<br />[[w:1955 Ford|1955-1956 Ford Customline sedan/Mainline Coupe Utility]]<br />[[w:1957 Ford|1957-1959 Ford Custom 300/Fairlane 500/Ranch Wagon]]<br />[[w:Ford F-Series|Ford Freighter/F-Series]]
| Production began in 1925 in a former wool storage warehouse in Geelong before moving to a new plant in the Geelong suburb that later became known as Norlane. Vehicle production later moved to Broadmeadows plant that opened in 1959.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Geelong Aluminum Casting
| style="text-align:left;"| [[w:Norlane, Victoria|Norlane, Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 2016
| style="text-align:left;"| Aluminum cylinder heads, intake manifolds, and structural oil pans
| Opened 1986.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Geelong Iron Casting
| style="text-align:left;"| [[w:Norlane, Victoria|Norlane, Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 2016
| style="text-align:left;"| I6 engine blocks, camshafts, crankshafts, exhaust manifolds, bearing caps, disc brake rotors and flywheels
| Opened 1972.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Geelong Chassis Components
| style="text-align:left;"| [[w:Norlane, Victoria|Norlane, Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 2004
| style="text-align:left;"| Parts - Machine cylinder heads, suspension arms and brake rotors
| Opened 1983.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Geelong Engine
| style="text-align:left;"| [[w:Norlane, Victoria|Norlane, Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 2016
| style="text-align:left;"| [[w:Ford 335 engine#302 and 351 Cleveland (Australia)|Ford 302 & 351 Cleveland V8]]<br />[[w:Ford straight-six engine#Ford Australia|Ford Australia Falcon I6]]<br />[[w:Ford Barra engine#Inline 6|Ford Australia Barra I6]]
| Opened 1926.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Geelong Stamping
| style="text-align:left;"| [[w:Norlane, Victoria|Norlane, Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 2016
| style="text-align:left;"| Ford Falcon/Futura/Fairmont body panels <br /> Ford Falcon Utility body panels <br /> Ford Territory body panels
| Opened 1926. Previously: Ford Fairlane body panels <br /> Ford LTD body panels <br /> Ford Capri body panels <br /> Ford Cortina body panels <br /> Welded subassemblies and steel press tools
|- style="vertical-align:top;"
| style="text-align:center;"| B (EU) [when following G]
| style="text-align:left;"| [[w:Genk Body & Assembly|Genk Body & Assembly]]
| style="text-align:left;"| [[w:Genk|Genk]]
| style="text-align:left;"| [[w:Belgium|Belgium]]
| style="text-align:center;"| Closed in 2014
| style="text-align:left;"| [[w:Ford Mondeo|Ford Mondeo]]<br /> [[w:Ford S-Max|Ford S-MAX]]<br /> [[w:Ford Galaxy|Ford Galaxy]]
| Opened in 1964.<br /> Previously: [[w:Ford Taunus P4|Ford Taunus P4]]<br />[[w:Ford Taunus P5|Ford Taunus P5]]<br />[[w:Ford Taunus P6|Ford Taunus P6]]<br />[[w:Ford P7|Ford Taunus P7]]<br />[[w:Ford Taunus TC|Ford Taunus TC]]<br />[[w:Ford Anglia#Anglia Torino 105E (1965–67)|Ford Anglia Torino]]<br />[[w:Ford Escort (Europe)#First generation (1967–1975)|Ford Escort]]<br />[[w:Ford Sierra|Ford Sierra]]<br />[[w:Ford Transit|Ford Transit]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| GETRAG FORD Transmissions Bordeaux Transaxle Plant
| style="text-align:left;"| [[w:Blanquefort, Gironde|Blanquefort]]
| style="text-align:left;"| [[w:France|France]]
| style="text-align:center;"| Sold to Getrag/Magna Powertrain in 2021
| style="text-align:left;"| [[w:Ford BC-series transmission|Ford BC4/BC5 transmission]]<br />[[w:Ford BC-series transmission#iB5 Version|Ford iB5 transmission (5MTT170/5MTT200)]]<br />[[w:Ford Durashift#Durashift EST|Ford Durashift-EST(iB5-ASM/5MTT170-ASM)]]<br />MX65 transmission<br />CTX [[w:Continuously variable transmission|CVT]]
| Opened in 1976. Became a joint venture with [[w:Getrag|Getrag]] in 2001. Joint Venture: 50% Ford Motor Company / 50% Getrag Transmission. Joint venture dissolved in 2021 and this plant was kept by Getrag, which was taken over by [[w:Magna Powertrain|Magna Powertrain]] in 2015.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Green Island Plant
| style="text-align:left;"| [[w:Green Island, New York|Green Island, New York]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1989)
| style="text-align:left;"| Radiators, springs
| style="text-align:left;"| 1922-1989, demolished in 2004
|- style="vertical-align:top;"
| style="text-align:center;"| B (EU) (for Fords) [when following B],<br> X (for Jaguar w/2.5L),<br> W (for Jaguar w/3.0L),<br> H (for Land Rover)
| style="text-align:left;"| [[w:Halewood Body & Assembly|Halewood Body & Assembly]]
| style="text-align:left;"| [[w:Halewood|Halewood]], [[w:Merseyside|Merseyside]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Sold (2008)
| style="text-align:left;"| [[w:Ford Anglia|Ford Anglia]], [[w:Ford Corsair|Ford Corsair]], [[w:Ford Escort (Europe)|Ford Escort]], [[w:Ford Capri|Ford Capri]], [[w:Ford Orion|Ford Orion]], [[w:Jaguar X-Type|Jaguar X-Type]], [[w:Land Rover Freelander#Freelander 2 (L359; 2006–2015)|Land Rover Freelander 2 / LR2]]
| style="text-align:left;"| 1963–2008. Ford assembly ended in July 2000, then transferred to Jaguar/Land Rover. Sold to [[w:Tata Motors|Tata Motors]] with Jaguar/Land Rover business. The van variant of the Escort remained in production in a facility located behind the now Jaguar plant at Halewood until October 2002.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Hamilton Plant
| style="text-align:left;"| [[w:Hamilton, Ohio|Hamilton, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1950)
| style="text-align:left;"| [[w:Fordson|Fordson]] tractors/tractor components<br /> Wheels for cars like Model T & Model A<br />Locks and lock parts<br />Radius rods<br />Running Boards
| style="text-align:left;"| Opened in 1920. Factory used hydroelectric power. Switched from tractors to auto parts less than 6 months after production began. Also made parts for bomber engines during World War II. Plant closed in 1950. Sold to Bendix Aviation Corporation in 1951. Bendix closed the plant in 1962 and sold it in 1963 to Ward Manufacturing Co., which made camping trailers there. In 1975, it was sold to Chem-Dyne Corp., which used it for chemical waste storage & disposal. Demolished around 1981 as part of a Federal Superfund cleanup of the site.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Heimdalsgade Assembly
| style="text-align:left;"| [[w:Heimdalsgade|Heimdalsgade street]], [[w:Nørrebro|Nørrebro district]], [[w:Copenhagen|Copenhagen]]
| style="text-align:left;"| [[w:Denmark|Denmark]]
| style="text-align:center;"| Closed (1924)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| 1919–1924. Was replaced by, at the time, Europe's most modern Ford-plant, "Sydhavnen Assembly".
|- style="vertical-align:top;"
| style="text-align:center;"| HP/HM/H (NA)
| style="text-align:left;"| [[w:Highland Park Ford Plant|Highland Park Plant]]
| style="text-align:left;"| [[w:Highland Park, Michigan|Highland Park, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Sold (1981)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />Ford trucks (pre-1948)<br />[[w:Ford F-Series|Ford F-Series]] (1948-1950, 1951-1956)<br /> [[w:Ford F-Series (medium-duty truck)#Second generation (1953–1956)|Ford F-Series (medium-duty truck)]] (1953, 1956)<br />[[w:Fordson|Fordson]] tractors and tractor components
| style="text-align:left;"| Located at 91 Manchester Avenue (at Woodward Avenue). Ford Motor Company's third American factory. Was also Ford's world headquarters from 1910-1927. First automobile factory in history to utilize a moving assembly line (implemented October 7, 1913). Model T production from 1910 to 1927. Car production then shifted to the Rouge complex in Dearborn. Continued to make automotive trim parts after 1927. Also made [[w:M4 Sherman#M4A3|M4A3 Sherman tanks]], M34 and M34A1 Gun Mounts for Sherman Tanks, M10A1 "Wolverine" Tank Destroyers, M7 gun directors, Squad Tents for the Army, and parts for Pratt & Whitney R-2800 radial aircraft engines made by Ford at the Rouge complex during World War II. Became Ford's main tractor plant in 1947. One of the first 2 Ford plants to build the <br> F-Series, beginning November 27, 1947 (other was Richmond, California). F-Series truck production ended in 1957. Production of trim parts ended in the 1960s. Tractor production ended in 1974. Ford sold the Highland Park plant in October 1981, but continues to lease space there for storage. In October 2012, Ford moved its records storage out of Highland Park (Bldg. AA). Some of the site has been demolished and replaced by a mall called Model T Plaza but multiple buildings of the complex are still standing. A Forman Mills store opened in Bldg. JJ. Listed on the National Register of Historic Places in 1973. Designated a National Historic Landmark in 1978.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Hobart Assembly Plant
| style="text-align:left;"|[[w:Hobart, Tasmania|Hobart, Tasmania]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br /> [[w:Ford Model A (1927–1931)| Ford Model A]] <br>Ford trucks <br> Ford tractors
| style="text-align:left;"| Located on Collins Street. Plant opened in December 1925.
|- style="vertical-align:top;"
| style="text-align:center;"| K (AU)
| style="text-align:left;"| Homebush Assembly Plant
| style="text-align:left;"| [[w:Homebush West, New South Wales|Homebush (Sydney), NSW]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 1994
| style="text-align:left;"| [[w:Ford Model 48|Ford Model 48]]<br>[[w:Ford Consul|Ford Consul]]<br>[[w:Ford Zephyr|Ford Zephyr]]<br>[[w:Ford Cortina|Ford Cortina]]<br> [[w:Ford Escort (Europe)|Ford Escort Mk. 1 & 2]]<br /> [[w:Ford Capri#Ford Capri Mk I (1969–1974)|Ford Capri]] Mk.1<br />[[w:Ford Fairlane (Australia)#Intermediate Fairlanes (1962–1965)|Ford Fairlane (1962-1964)]]<br />[[w:Ford Galaxie|Ford Galaxie]] (1965-1968)<br />[[w:Ford Laser|Ford Laser]]<br /> [[w:Ford Meteor|Ford Meteor]]<br />[[w:Ford Transit#First generation (1965)|Ford Transit]]<br />[[w:Ford Mustang (first generation)|Ford Mustang (conversion to right hand drive)]]
| style="text-align:left;"| Ford’s first factory in New South Wales opened in 1925 in the Sandown area of Sydney making the [[w:Ford Model T|Ford Model T]] and later the [[w:Ford Model A (1927–1931)| Ford Model A]] and the [[w:1932 Ford|1932 Ford]]. This plant was replaced by the Homebush plant which opened in March 1936 and later closed in September 1994.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:List of Hyundai Motor Company manufacturing facilities#Ulsan Plant|Hyundai Ulsan Plant]]
| style="text-align:left;"| [[w:Ulsan|Ulsan]]
| style="text-align:left;"| [[w:South Korea|South Korea]]
| style="text-align:center;"| Ford production ended in 1985. Licensing agreement with Ford ended.
| style="text-align:left;"| [[w:Ford Cortina|Ford Cortina]] Mk2-Mk5<br />[[w:Ford P7|Ford P7]]<br />[[w:Ford Granada (Europe)#Mark II (1977–1985)|Ford Granada MkII]]<br />[[w:Ford D series|Ford D-750/D-800]]<br />[[w:Ford R series|Ford R-182]]
| [[w:Hyundai Motor|Hyundai Motor]] began by producing Ford models under license. Replaced by self-developed Hyundai models.
|- style="vertical-align:top;"
| style="text-align:center;"| J (NA)
| style="text-align:left;"| IMMSA
| style="text-align:left;"| [[w:Monterrey, Nuevo Leon|Monterrey, Nuevo Leon]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| Closed (2000). Agreement with Ford ended.
| style="text-align:left;"| Ford M450 motorhome chassis
| Replaced by Detroit Chassis LLC plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Indianapolis Steering Systems Plant
| style="text-align:left;"| [[w:Indianapolis|Indianapolis, IN]]
| style="text-align:left;"| U.S.
| style="text-align:center;"|1957–2011, demolished in 2017
| style="text-align:left;"| Steering columns, Steering gears
| style="text-align:left;"| Located at 6900 English Ave. Spun off as part of [[w:Visteon|Visteon]] in 2000. Taken back by Ford in 2005 as part of [[w:Automotive Components Holdings|Automotive Components Holdings]] LLC. Closed in 2011. Demolished in 2017.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Industrias Chilenas de Automotores SA (Chilemotores)
| style="text-align:left;"| [[w:Arica|Arica]]
| style="text-align:left;"| [[w:Chile|Chile]]
| style="text-align:center;" | Closed c.1969
| [[w:Ford Falcon (North America)|Ford Falcon]]
| Opened 1964. Was a 50/50 joint venture between Ford and Bolocco & Cia. Replaced by Ford's 100% owned Casablanca, Chile plant.<ref name=":2">{{Cite web |last=S.A.P |first=El Mercurio |date=2020-04-15 |title=Infografía: Conoce la historia de la otrora productiva industria automotriz chilena {{!}} Emol.com |url=https://www.emol.com/noticias/Autos/2020/04/15/983059/infiografia-historia-industria-automotriz-chile.html |access-date=2022-11-05 |website=Emol |language=Spanish}}</ref>
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Inokom|Inokom]]
| style="text-align:left;"| [[w:Kulim, Kedah|Kulim, Kedah]]
| style="text-align:left;"| [[w:Malaysia|Malaysia]]
| style="text-align:center;"| Ford production ended 2016
| [[w:Ford Transit#Facelift (2006)|Ford Transit]]
| Plant owned by Inokom
|- style="vertical-align:top;"
| style="text-align:center;"| D (SA)
| style="text-align:left;"| [[w:Ford Brasil|Ipiranga Assembly]]
| style="text-align:left;"| [[w:Ipiranga (district of São Paulo)|Ipiranga, São Paulo]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Closed (2000)
| CKD, Ford tractors, [[w:Ford F-Series|Ford F-Series]], [[w:Ford Galaxie#Brazilian production|Ford Galaxie]], [[w:Ford Landau|Ford Landau]], [[w:Ford LTD (Americas)#Brazil|Ford LTD]], [[w:Ford Cargo|Ford Cargo]] Trucks, Ford B-1618 & B-1621 bus chassis, Ford B12000 school bus chassis, [[w:Volkswagen Delivery|VW Delivery]], [[w:Volkswagen Worker|VW Worker]], [[w:Volkswagen L80|VW L80]], [[w:Volkswagen Volksbus|VW Volksbus 16.180 CO bus chassis]]
| Part of Autolatina joint venture with VW from 1987 to 1996.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Brasil|Ipiranga Engine]]
| style="text-align:left;"| [[w:Ipiranga (district of São Paulo)|Ipiranga, São Paulo]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Closed
| [[w:Ford Y-block engine#272|Ford 272 Y-block V8]], [[w:Ford Y-block engine#292|Ford 292 Y-block V8]]
|
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Otosan#History|Istanbul Assembly]]
| style="text-align:left;"| [[w:Tophane|Tophane]], [[w:Istanbul|Istanbul]]
| style="text-align:left;"| [[w:Turkey|Turkey]]
| style="text-align:center;"| Production stopped in 1934 as a result of the [[w:Great Depression|Great Depression]]. Then handled spare parts & service for existing cars. Closed entirely in 1944.
| style="text-align:left;"| [[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]
| Opened 1929.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Browns Lane plant|Jaguar Browns Lane plant]]
| style="text-align:left;"| [[w:Coventry|Coventry]], [[w:West Midlands (county)|West Midlands]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (2007)
| style="text-align:left;"| [[w:Jaguar XJ|Jaguar XJ]]<br />[[w:Jaguar XJ-S|Jaguar XJ-S]]<br />[[w:Jaguar XK (X100)|Jaguar XK8/XKR (X100)]]<br />[[w:Jaguar XJ (XJ40)#Daimler/Vanden Plas|Daimler six-cylinder sedan (XJ40)]]<br />[[w:Daimler Six|Daimler Six]] (X300)<br />[[w:Daimler Sovereign#Daimler Double-Six (1972–1992, 1993–1997)|Daimler Double Six]]<br />[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Daimler Eight/Super V8]] (X308)<br />[[w:Daimler Super Eight|Daimler Super Eight]] (X350/X356)<br /> [[w:Daimler DS420|Daimler DS420]]
| style="text-align:left;"|
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Castle Bromwich Assembly|Jaguar Castle Bromwich Assembly]]
| style="text-align:left;"| [[w:Castle Bromwich|Castle Bromwich]], [[w:West Midlands (county)|West Midlands]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Sold (2008)
| style="text-align:left;"| [[w:Jaguar S-Type (1999)|Jaguar S-Type]]<br />[[w:Jaguar XF (X250)|Jaguar XF (X250)]]<br />[[w:Jaguar XJ (X350)|Jaguar XJ (X356/X358)]]<br />[[w:Jaguar XJ (X351)|Jaguar XJ (X351)]]<br />[[w:Jaguar XK (X150)|Jaguar XK (X150)]]<br />[[w:Daimler Super Eight|Daimler Super Eight]] <br />Painted bodies for models made at Browns Lane
| style="text-align:left;"| Sold to [[w:Tata Motors|Tata Motors]] in 2008 as part of sale of Jaguar Land Rover.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Jaguar Radford Engine
| style="text-align:left;"| [[w:Radford, Coventry|Radford]], [[w:West Midlands (county)|West Midlands]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (1997)
| style="text-align:left;"| [[w:Jaguar AJ6 engine|Jaguar AJ6 engine]]<br />[[w:Jaguar V12 engine|Jaguar V12 engine]]<br />Axles
| style="text-align:left;"| Originally a [[w:Daimler Company|Daimler]] site. Daimler had built buses in Radford. Jaguar took over Daimler in 1960.
|- style="vertical-align:top;"
| style="text-align:center;"| K (EU) [when following G] (for Ford), <br> M (NA) (for Merkur)
| style="text-align:left;"| [[w:Karmann|Karmann Rheine Assembly]]
| style="text-align:left;"| [[w:Rheine|Rheine]], [[w:North Rhine-Westphalia|North Rhine-Westphalia]]
| style="text-align:left;"| [[w:Germany|Germany]]
| style="text-align:center;"| Closed in 2008 (Ford production ended in 1997)
| [[w:Ford Escort (Europe)|Ford Escort Convertible]]<br />[[w:Ford Escort RS Cosworth|Ford Escort RS Cosworth]]<br />[[w:Merkur XR4Ti|Merkur XR4Ti]] (1985-1989)
| Plant owned by [[w:Karmann|Karmann]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| Kechnec Transmission (Getrag Ford Transmissions)
| style="text-align:left;"| [[w:Kechnec|Kechnec]], [[w:Košice Region|Košice Region]]
| style="text-align:left;"| [[w:Slovakia|Slovakia]]
| style="text-align:center;"| Sold to [[w:Getrag|Getrag]]/[[w:Magna Powertrain|Magna Powertrain]] in 2019
| style="text-align:left;"| Ford MPS6 transmissions<br /> Ford SPS6 transmissions
| style="text-align:left;"| Ford/Getrag "Powershift" dual clutch transmission. Originally owned by Getrag Ford Transmissions - a joint venture 50% owned by Ford Motor Company & 50% owned by Getrag Transmission. Plant sold to Getrag in 2019. Getrag Ford Transmissions joint venture was dissolved in 2021. Getrag was previously taken over by [[w:Magna Powertrain|Magna Powertrain]] in 2015.
|- style="vertical-align:top;"
| style="text-align:center;"| 6 (NA)
| style="text-align:left;"| [[w:Kia Design and Manufacturing Facilities#Sohari Plant|Kia Sohari Plant]]
| style="text-align:left;"| [[w:Gwangmyeong|Gwangmyeong]]
| style="text-align:left;"| [[w:South Korea|South Korea]]
| style="text-align:center;"| Ford production ended (2000)
| style="text-align:left;"| [[w:Ford Festiva|Ford Festiva]] (US: 1988-1993)<br />[[w:Ford Aspire|Ford Aspire]] (US: 1994-1997)
| style="text-align:left;"| Plant owned by Kia.
|- style="vertical-align:top;"
| style="text-align:left;"|
| style="text-align:left;"| [[w:Ford Motor Argentina|La Boca Assembly]]
| style="text-align:left;"| [[w:La Boca|La Boca]], [[w:Buenos Aires|Buenos Aires]]
| style="text-align:left;"| [[w:Argentina|Argentina]]
| style="text-align:center;"| Closed (1961)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />[[w:Ford F-Series (third generation)|Ford F-Series (Gen 3)]]<br />[[w:Ford B series#Third generation (1957–1960)|Ford B-600 bus]]<br />[[w:Ford F-Series (fourth generation)#Argentinian-made 1961–1968|Ford F-Series (Early Gen 4)]]
| style="text-align:left;"| Replaced by the [[w:Pacheco Stamping and Assembly|General Pacheco]] plant in 1961.
|- style="vertical-align:top;"
| style="text-align:center;"| F
| style="text-align:left;"| La Villa Assembly
| style="text-align:left;"| La Villa, [[w:Mexico City|Mexico City]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| Closed (1984)
| style="text-align:left;"| [[w:1932 Ford|1932 Ford]]<br />[[w:Ford Anglia|Ford Anglia]]<br />[[w:Ford Consul|Ford Consul]]<br />[[w:Ford Taunus|Ford Taunus]]<br />[[w:Ford Falcon (North America)|Ford Falcon]]<br />[[w:Ford Maverick (1970–1977)|Ford Falcon Maverick]]<br />[[w:Ford Fairmont|Ford Fairmont/Elite II]]<br />[[w:Ford Galaxie|Ford Galaxie]]<br />[[w:Ford LTD (Americas)|Ford LTD]]<br />[[w:Ford Thunderbird|Ford Thunderbird]]<br />[[w:Ford Mustang (first generation)|Ford Mustang]]<br />[[w:Ford Mustang (second generation)|Ford Mustang II]]
| style="text-align:left;"| Replaced San Lazaro plant. Opened 1932.<ref>{{cite web|url=http://www.fundinguniverse.com/company-histories/ford-motor-company-s-a-de-c-v-history/|title=History of Ford Motor Company, S.A. de C.V. – FundingUniverse|website=www.fundinguniverse.com}}</ref> Is now the Plaza Tepeyac shopping center.
|- style="vertical-align:top;"
| style="text-align:center;"| A
| style="text-align:left;"| [[w:Solihull plant|Land Rover Solihull Assembly]]
| style="text-align:left;"| [[w:Solihull|Solihull]], [[w:West Midlands (county)|West Midlands]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Sold (2008)
| style="text-align:left;"| [[w:Land Rover Defender|Land Rover Defender (L316)]]<br />[[w:Land Rover Discovery#First generation|Land Rover Discovery]]<br />[[w:Land Rover Freelander#First generation (L314; 1997–2006)|Land Rover Freelander]]<br />[[w:Land Rover Discovery#Discovery 3 / LR3 (2004–2009)|Land Rover Discovery 3/LR3]]<br />[[w:Land Rover Discovery#Discovery 4 / LR4 (2009–2016)|Land Rover Discovery 4/LR4]]<br />[[w:Range Rover (P38A)|Land Rover Range Rover (P38A)]]<br /> [[w:Range Rover (L322)|Land Rover Range Rover (L322)]]<br /> [[w:Range Rover Sport#First generation (L320; 2005–2013)|Land Rover Range Rover Sport]]
| style="text-align:left;"| Sold to [[w:Tata Motors|Tata Motors]] in 2008 as part of sale of Jaguar Land Rover.
|- style="vertical-align:top;"
| style="text-align:center;"| C (EU) [when following B]
| style="text-align:left;"| Langley Assembly
| style="text-align:left;"| [[w:Langley, Berkshire|Langley, Slough]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Sold/closed (1986/1997)
| style="text-align:left;"| [[w:Ford Transit|Ford Transit]] and [[w:Ford A series|Ford A-series]] vans; [[w:Ford D Series|Ford D-Series]] and [[w:Ford Cargo|Ford Cargo]] trucks; [[w:Ford R series|Ford R-Series]] bus/coach chassis
| style="text-align:left;"| 1949–1986. Former Hawker aircraft factory. Sold to Iveco, closed 1997.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Largs Bay Assembly Plant
| style="text-align:left;"| [[w:Largs Bay, South Australia|Largs Bay (Port Adelaide Enfield), South Australia]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed 1965
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]] <br /> [[w:Ford Model A (1927–1931)|Ford Model A]] <br /> [[w:1932 Ford|1932 Ford]] <br /> [[w:Ford Model 48|Ford Model 48]]<br>[[w:1937 Ford|1937 Ford]]<br>[[w:Ford Zephyr|Ford Zephyr]]<br>[[w:Ford Customline|Ford Customline]]
| style="text-align:left;"| Plant opened in 1926. Was at the corner of Victoria Rd and Jetty Rd. Later used by James Hardie to manufacture asbestos fiber sheeting. Is now Rapid Haulage at 214 Victoria Road.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Leamington Foundry
| style="text-align:left;"| [[w:Leamington Spa|Leamington Spa]], [[w:Warwickshire|Warwickshire]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (2007)
| style="text-align:left;"| Castings including brake drums and discs, differential gear cases, flywheels, hubs and exhaust manifolds
| style="text-align:left;"| Opened in 1940, closed in July 2007. Demolished 2012.
|- style="vertical-align:top;"
| style="text-align:center;"| LP (NA)
| style="text-align:left;"| [[w:Lincoln Motor Company Plant|Lincoln Motor Company Plant]]
| style="text-align:left;"| [[w:Detroit, Michigan|Detroit, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1952); Most buildings demolished in 2002-2003
| style="text-align:left;"| [[w:Lincoln L series|Lincoln L series]]<br />[[w:Lincoln K series|Lincoln K series]]<br />[[w:Lincoln Custom|Lincoln Custom]]<br />[[w:Lincoln-Zephyr|Lincoln-Zephyr]]<br />[[w:Lincoln EL-series|Lincoln EL-series]] (1950-1951)<br />[[w:Lincoln Cosmopolitan|Lincoln Cosmopolitan]] (1950-1952)<br /> [[w:Lincoln Capri#First generation (1952–1955))|Lincoln Capri]] (1952 only)<br />[[w:Lincoln Continental#First generation (1940–1942, 1946–1948)|Lincoln Continental (retroactively Mark I)]] <br /> [[w:Mercury Monterey|Mercury Monterey]] (1952)
| Located at 6200 West Warren Avenue at corner of Livernois. Built before Lincoln was part of Ford Motor Co. Ford kept some offices here after production ended in 1952. Sold to Detroit Edison in 1955. Eventually replaced by Wixom Assembly plant. Mostly demolished in 2002-2003.
|- style="vertical-align:top;"
| style="text-align:center;"| J (NA)
| style="text-align:left;"| [[w:Los Angeles Assembly|Los Angeles Assembly]] (Los Angeles Assembly plant #2)
| style="text-align:left;"| [[w:Pico Rivera, California|Pico Rivera, California]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1957 to 1980
| style="text-align:left;"|
| style="text-align:left;"|Located at 8900 East Washington Blvd. and Rosemead Blvd. Sold to Northrop Aircraft Company in 1982 for B-2 Stealth Bomber development. Demolished 2001. Now the Pico Rivera Towne Center, an open-air shopping mall. Plant only operated one shift due to California Air Quality restrictions. First vehicles produced were the Edsel [[w:Edsel Corsair|Corsair]] (1958) & [[w:Edsel Citation|Citation]] (1958) and Mercurys. Later vehicles were [[w:Ford 300|Ford 300]] (1963), [[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1964-1965, 1968), [[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1960-1961),[[w:Ford Galaxie|Galaxie]] (1959-1971, 1973), [[w:Ford LTD (Americas)|LTD]] (1967-1976, 1978, 1980), [[w:Mercury Monterey|Mercury Monterey]] (1960-1962), [[w:Mercury Park Lane|Mercury Park Lane]] (1958), [[w:Mercury S-55|Mercury S-55]], [[w:Mercury Marauder|Mercury Marauder]], [[w:Mercury Meteor#Full-size (1961)|Mercury Meteor]], [[w:Mercury Marquis|Mercury Marquis]], [[w:Mercury Montclair|Mercury Montclair]] (1958-1960, 1967), [[w:Mercury Turnpike Cruiser|Mercury Turnpike Cruiser]] (1958), and [[w:Ford Thunderbird|Ford Thunderbird]] (1968-1979). Also, [[w:Ford Falcon (North America)|Ford Falcon]], [[w:Mercury Comet|Mercury Comet]] (1962-1967), [[w:Ford LTD II|Ford LTD II]], & [[w:Mercury Cougar#Fourth generation (1977–1979)|Mercury Cougar]]. Thunderbird production ended after the 1979 model year. The last vehicle produced was the Panther platform [[w:Ford LTD (Americas)#Third generation (1979–1982)|Ford LTD]] on January 26, 1980. Built 1,419,498 vehicles.
|- style="vertical-align:top;"
| style="text-align:center;"| LA (early)/<br>LB/L (NA)
| style="text-align:left;"| [[w:Long Beach Assembly|Long Beach Assembly]]
| style="text-align:left;"| [[w:Long Beach, California|Long Beach, California]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1930 to 1959
| style="text-align:left;"| (1930-32, 1934-59):<br> [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]],<br> [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]],<br> [[w:1957 Ford|1957 Ford]] (1957-1959), [[w:Ford Galaxie|Ford Galaxie]] (1959),<br> [[w:Ford F-Series|Ford F-Series]] (1951-1958).
| style="text-align:left;"| Located at 700 Henry Ford Ave. Ended production March 20, 1959 when the site became unstable due to oil drilling. Production moved to the Los Angeles plant in Pico Rivera. Ford sold the Long Beach plant to the Dallas and Mavis Forwarding Company of South Bend, Indiana on January 28, 1960. It was then sold to the Port of Long Beach in the 1970's. Demolished from 1990-1991.
|- style="vertical-align:top;"
| style="text-align:center;"| H (NA)
| style="text-align:left;"| [[w:Lorain Assembly|Lorain Assembly]]
| style="text-align:left;"| [[w:Lorain, Ohio|Lorain, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1958 to 2005
| style="text-align:left;"| [[w:Ford Econoline|Ford Econoline/Club Wagon/E-Series]] (1961-2006)
| style="text-align:left;"|Located at 5401 Baumhart Road. Closed December 14, 2005. Produced 15,805,106 vehicles, nearly half of which are Econoline/Club Wagon/<br>E-Series vans. Operations transferred to Avon Lake.<br /> Previously:<br> [[w:Ford Galaxie|Ford Galaxie]] (1959)<br />[[w:Ford Ranchero|Ford Ranchero]] (1959-1965, 1978-1979)<br />[[w:Ford Falcon (North America)|Ford Falcon]] (1960-1965)<br />[[w:Mercury Comet#First generation (1960–1963)|Comet]] (1960-1961)<br />[[w:Mercury Comet|Mercury Comet]] (1962-1969)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane]] (1966-1969)<br />[[w:Ford Torino|Ford Torino]] (1968-1976)<br />[[w:Mercury Montego|Mercury Montego]] (1968-1976)<br />[[w:Mercury Cyclone|Mercury Cyclone]] (1968-1971)<br />[[w:Ford LTD II|Ford LTD II]] (1977-1979)<br />[[w:Ford Thunderbird|Ford Thunderbird]] (1980-1997)<br />[[w:Mercury Cougar#Fourth generation (1977–1979)|Mercury Cougar]] (1977-1979)<br />[[w:Mercury Cougar#Fifth generation (1980–1982)|Mercury Cougar XR-7]] (1980-1982)<br />[[w:Mercury Cougar#Sixth generation (1983–1988)|Mercury Cougar]] (1983-1988)<br />[[w:Mercury Cougar#Seventh generation (1989–1997)|Mercury Cougar]] (1989-1997)<br />[[w:Ford F-Series|Ford F-Series]] (1959-1964)<br />[[w:Ford E-Series#Mercury Econoline|Mercury Econoline pickup]] (1961) <br />[[w:Ford E-Series#Mercury Econoline|Mercury Econoline]] (1966-1967)
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Mack Avenue Plant|Mack Avenue Plant]]
| style="text-align:left;"| [[w:Detroit|Detroit, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Ford production: June 1903-October 1904
| style="text-align:left;"| Original [[w:Ford Model A (1903–04)|Ford Model A]] [[w:Ford Model A (1903–04)#Ford Model AC|Ford Model AC]]
| style="text-align:left;"| 1903–1904. Ford Motor Company's first factory (rented). Ford began occupying the rented plant in April 1903 but production didn't start until after Ford Motor Co. was incorporated in June 1903. Ford assembled components here that were purchased from other companies including Dodge Bros. Co., which supplied the chassis, engine, transmission, driveshaft, and both axles. A second story was added in late 1903 to provide a paint shop and additional space for storage. Ford relocated to the Piquette Ave. plant in Detroit in Oct. 1904 because they had outgrown the Mack Ave. plant and needed a larger factory space. The Mack Avenue Plant's address was originally 588–592 Mack Avenue when Ford Motor Company occupied the building. Its address became 6520 Mack Avenue after the city of Detroit changed its street numbering system in January 1921. Various other tenants occupied the building after Ford left including the Columbia Motors Co. Columbia Motors also occupied the building diagonally across Mack Ave. (6501 Mack Ave.) which was originally owned by the Aerocar Co., founded by Alexander Malcomson, an early investor in Ford Motor Co. who had a falling out with Henry Ford regarding company direction. After Aerocar went bankrupt in 1907, 6501 Mack Ave. was the first plant of Hudson Motor Car Co. Hudson quickly outgrew the plant and moved a few miles away to a larger plant. The Ford plant building burned down in August 1941. An imprecise replica of the building was built in 1945 and is located at [[w:The Henry Ford|The Henry Ford]].
|- style="vertical-align:top;"
| style="text-align:center;"| E (NA)
| style="text-align:left;"| [[w:Mahwah Assembly|Mahwah Assembly]]
| style="text-align:left;"| [[w:Mahwah, New Jersey|Mahwah, New Jersey]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1955 to 1980.
| style="text-align:left;"| Last vehicles produced:<br> [[w:Ford Fairmont|Ford Fairmont]] (1978-1980)<br /> [[w:Mercury Zephyr|Mercury Zephyr]] (1978-1980)
| style="text-align:left;"| Located on Orient Blvd. Truck production ended in July 1979. Car production ended in June 1980 and the plant closed. Demolished. Site then used by Sharp Electronics Corp. as a North American headquarters from 1985 until 2016 when former Ford subsidiaries Jaguar Land Rover took over the site for their North American headquarters. Another part of the site is used by retail stores.<br /> Previously:<br> [[w:Ford F-Series|Ford F-Series]] (1955-1958, 1960-1979)<br />[[w:1955 Ford|1955 Ford]]<br />[[w:1957 Ford|1957 Ford]]<br />[[w:Ford Ranchero|Ford Ranchero]] (1957)<br />[[w:Edsel Pacer|Edsel Pacer]] (1958)<br />[[w:Edsel Ranger|Edsel Ranger]] (1958)<br />[[w:Edsel Roundup|Edsel Roundup]] (1958)<br />[[w:Edsel Villager|Edsel Villager]] (1958)<br />[[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1961)<br />[[w:Ford 300|Ford 300]] (1963)<br />[[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1964, 1966-1967)<br />[[w:Ford Galaxie|Ford Galaxie]] (1959-1970)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1966-1967, 1969, 1971-1972, 1974)<br /> [[w:Mercury Monterey|Mercury Monterey]] (1961-1963) <br /> [[w:Mercury Commuter|Mercury Commuter]] (1962)<br /> [[w:Ford Granada (North America)#First generation (1975–1980)|Ford Granada]] (1975-1980)<br />[[w:Mercury Monarch|Mercury Monarch]] (1975-1980)
|- style="vertical-align:top;"
|
| style="text-align:left;"| Manukau Alloy Wheel
| style="text-align:left;"| [[w:Manukau|Manukau, Auckland]]
| style="text-align:left;"| [[w:New Zealand|New Zealand]]
| style="text-align:center;"| Sold (2001)
| style="text-align:left;"| Aluminum wheels and cross members
| style="text-align:left;"| Established 1981. Sold in 2001 to Argent Metals Technology
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Matford|Matford]]
| style="text-align:left;"| [[w:Strasbourg|Strasbourg]]
| style="text-align:left;"| [[w:France|France]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Mathis (automobile)|Mathis cars]]<br />Matford V8 cars <br />Matford trucks
| Matford was a joint venture 60% owned by Ford and 40% owned by French automaker Mathis. Replaced by Ford's own Poissy plant after Matford was dissolved.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Maumee Stamping
| style="text-align:left;"| [[w:Maumee, Ohio|Maumee, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (2007)
| style="text-align:left;"| body panels
| style="text-align:left;"| Closed in 2007, sold, and reopened as independent stamping plant
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:MÁVAG#Car manufacturing, the MÁVAG-Ford|MAVAG]]
| style="text-align:left;"| [[w:Budapest|Budapest]]
| style="text-align:left;"| [[w:Hungary|Hungary]]
| style="text-align:center;"| Closed (1939)
| [[w:Ford Eifel|Ford Eifel]]<br />[[w:1937 Ford|Ford V8]]<br />[[w:de:Ford-Barrel-Nose-Lkw|Ford G917T]]
| Opened 1938. Produced under license from Ford Germany. MAVAG was nationalized in 1946.
|- style="vertical-align:top;"
| style="text-align:center;"| LA (NA)
| style="text-align:left;"| [[w:Maywood Assembly|Maywood Assembly]] <ref>{{cite web|url=http://skyscraperpage.com/forum/showthread.php?t=170279&page=955|title=Photo of Lincoln-Mercury Assembly}}</ref> (Los Angeles Assembly plant #1)
| style="text-align:left;"| [[w:Maywood, California|Maywood, California]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1948 to 1957
| style="text-align:left;"| [[w:Mercury Eight|Mercury Eight]] (-1951), [[w:Mercury Custom|Mercury Custom]] (1955-1956), [[w:Mercury Medalist|Mercury Medalist]] (1956), [[w:Mercury Montclair|Mercury Montclair]] (1955-1957), [[w:Mercury Monterey|Mercury Monterey]] (1952-1957), [[w:Mercury Turnpike Cruiser|Mercury Turnpike Cruiser]] (1957), [[w:Lincoln EL-series|Lincoln EL-series]] (1950-1951), [[w:Lincoln Cosmopolitan|Lincoln Cosmopolitan]] (1951-1952, 1954), [[w:Lincoln Premiere|Lincoln Premiere]] (1956), [[w:Lincoln Capri|Lincoln Capri]] (1953-1956). Painting of Pico Rivera-built Edsel bodies until Pico Rivera's paint shop was up and running.
| style="text-align:left;"| Located at 5801 South Eastern Avenue and Slauson Avenue in Maywood, now part of City of Commerce. Across the street from the [[w:Los Angeles (Maywood) Assembly|Chrysler Los Angeles Assembly plant]]. Plant was demolished following closure.
|- style="vertical-align:top;"
| style="text-align:left;"| 0
| style="text-align:left;"| [[w:List of Mazda facilities#List of Mazda production plants|Mazda Hiroshima Assembly]]
| style="text-align:left;"| [[w:Hiroshima|Hiroshima]], [[w:Hiroshima Prefecture|Hiroshima Prefecture]]
| style="text-align:left;"| [[w:Japan|Japan]]
| style="text-align:center;"| Ford production ended. Ford no longer owns a stake in Mazda.
| style="text-align:left;"| [[w:Ford Courier#Mazda-based models|Ford Courier]]<br />[[w:Ford Festiva#Third generation (1996)|Ford Festiva Mini Wagon]]<br />[[w:Ford Freda|Ford Freda]]<br />[[w:Mazda Bongo|Ford Econovan/Econowagon/Spectron]]<br />[[w:Ford Raider|Ford Raider]]<br />[[w:Ford Trader|Ford Trader]]
| style="text-align:left;"| Plant owned by Mazda.
|- style="vertical-align:top;"
| style="text-align:left;"| 1
| style="text-align:left;"| [[w:List of Mazda facilities#List of Mazda production plants|Mazda Hofu Assembly]]
| style="text-align:left;"| [[w:Hofu|Hofu]], [[w:Yamaguchi Prefecture|Yamaguchi Prefecture]]
| style="text-align:left;"| [[w:Japan|Japan]]
| style="text-align:center;"| Ford production ended. Ford no longer owns a stake in Mazda.
| style="text-align:left;"| [[w:Ford Laser|Ford Laser]]<br />[[w:Ford Telstar|Ford Telstar]]
| style="text-align:left;"| Plant owned by Mazda.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Metcon Casting (Metalurgica Constitución S.A.)
| style="text-align:left;"| [[w:Villa Constitución|Villa Constitución]], [[w:Santa Fe Province|Santa Fe Province]]
| style="text-align:left;"| [[w:Argentina|Argentina]]
| style="text-align:center;"| Sold to Paraná Metal SA
| style="text-align:left;"| Parts - Iron castings
| Originally opened in 1957. Bought by Ford in 1967.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Monroe Stamping Plant
| style="text-align:left;"| [[w:Monroe, Michigan|Monroe, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"|Closed as a factory in 2008. Now a Ford warehouse.
| style="text-align:left;"| Coil springs, wheels, stabilizer bars, catalytic converters, headlamp housings, and bumpers. Chrome Plating (1956-1982)
| style="text-align:left;"| Located at 3200 E. Elm Ave. Originally built by Newton Steel around 1929 and subsequently owned by [[w:Alcoa|Alcoa]] and Kelsey-Hayes Wheel Co. Bought by Ford in 1949 and opened in 1950. Spun off as part of [[w:Visteon|Visteon]] in 2000. Taken back by Ford in 2005 as part of [[w:Automotive Components Holdings|Automotive Components Holdings]] LLC. Closed in 2008. Sold to parent Ford Motor Co. in 2009. Converted into Ford River Raisin Warehouse.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Montevideo Assembly
| style="text-align:left;"| [[w:Montevideo|Montevideo]]
| style="text-align:left;"| [[w:Uruguay|Uruguay]]
| style="text-align:center;"| Closed (1985)
| [[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Falcon (Argentina)|Ford Falcon]]<br />[[w:Ford F-Series|Ford F-Series]]<br />[[w:Ford D Series|Ford D series]]
| Plant was on Calle Cuaró. Opened 1920. Ford Uruguay S.A.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Nissan Motor Australia|Nissan Motor Australia]]
| style="text-align:left;"| [[w:Clayton, Victoria|Clayton]], [[w:Victoria (Australia)|Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Closed (1992)
| style="text-align:left;"| [[w:Ford Corsair#Ford Corsair (UA, Australia)|Ford Corsair (UA)]]<br />[[w:Nissan Pintara|Nissan Pintara]]<br />[[w:Nissan Skyline#Seventh generation (R31; 1985)|Nissan Skyline]]
| Plant owned by Nissan. Ford production was part of the [[w:Button Plan|Button Plan]].
|- style="vertical-align:top;"
| style="text-align:center;"| NK/NR/N (NA)
| style="text-align:left;"| [[w:Norfolk Assembly|Norfolk Assembly]]
| style="text-align:left;"| [[w:Norfolk, Virginia|Norfolk, Virginia]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1925 to 2007
| style="text-align:left;"| [[w:Ford F-Series|Ford F-Series]] (1951-2007)
| Located at 2424 Springfield Ave. on the Elizabeth River. Opened April 20, 1925. Production ended on June 28, 2007. Ford sold the property in 2011. Mostly Demolished. <br /> Previously: [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />[[w:1949 Ford|1949 Ford]]<br />[[w:1952 Ford|1952 Ford]]<br />[[w:1955 Ford|1955 Ford]]<br />[[w:1957 Ford|1957 Ford]] <br /> [[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1960-1961) <br /> [[w:Ford Galaxie|Ford Galaxie]] (1959-1970, 1973-1974)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1966-1967, 1974)
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Valve Plant|Ford Valve Plant]]
| style="text-align:left;"| [[w:Northville, Michigan|Northville, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1981)
| style="text-align:left;"| Engine valves for cars and tractors
| style="text-align:left;"| Located at 235 East Main Street. Previously a gristmill purchased by Ford in 1919 that was reconfigured to make engine valves from 1920 to 1936. Replaced with a new purpose-built structure designed by Albert Kahn in 1936 which includes a waterwheel. Closed in 1981. Later used as a manufacturing plant by R&D Enterprises from 1994 to 2005 to make heat exchangers. Known today as the Water Wheel Centre, a commercial space that includes design firms and a fitness club. Listed on the National Register of Historic Places in 1995.
|- style="vertical-align:top;"
| style="text-align:center;"| C (NA)
| style="text-align:left;"| [[w:Ontario Truck|Ontario Truck]]
| style="text-align:left;"| [[w:Oakville, Ontario|Oakville, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| Closed (2004)
| style="text-align:left;"|[[w:Ford F-Series|Ford F-Series]] (1966-2003)<br /> [[w:Ford F-Series (tenth generation)|Ford F-150 Heritage]] (2004)<br /> [[w:Ford F-Series (tenth generation)#SVT Lightning (1999-2004)|Ford F-150 Lightning SVT]] (1999-2004)
| Opened in 1965. Truck production moved from the neighboring Oakville Assembly plant when Ontario Truck opened in 1965. After Ontario Truck closed in 2004, it was absorbed into the Oakville Assembly plant.<br /> Previously:<br> [[w:Mercury M-Series|Mercury M-Series]] (1966-1968)
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Officine Stampaggi Industriali|OSI]]
| style="text-align:left;"| [[w:Turin|Turin]]
| style="text-align:left;"| [[w:Italy|Italy]]
| style="text-align:center;"| Closed (1967)
| [[w:Ford Anglia#Anglia Torino 105E (1965–67)|Ford Anglia Torino]]<br />[[w:OSI-Ford 20 M TS|OSI-Ford 20 M TS]]
| Plant owned by [[w:Officine Stampaggi Industriali|OSI]]
|- style="vertical-align:top;"
| style="text-align:left;"|
| style="text-align:left;"| [[w:Otosan|Ford Otosan Assembly]]
| style="text-align:left;"| [[w:Istanbul|Istanbul]]
| style="text-align:left;"| [[w:Turkey|Turkey]]
| style="text-align:center;"| Closed (2001)
| style="text-align:left;"| [[w:Ford Consul|Ford Consul]]<br />[[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Taunus TC#Turkey|Ford Taunus]]<br />[[w:Ford Transit|Ford Transit]]<br />[[w:Ford F-Series (fourth generation)|Ford F-600]]<br />[[w:Ford Cargo|Ford Cargo]]<br />[[w:Ford D series|Ford D Series]]<br />[[w:Ford Thames 400E|Ford Thames 800]]<br />[[w:Thames Trader|Thames Trader]]<br />[[w:Ford P100#Cortina-based model|Otosan P100]]<br />[[w:Anadol|Anadol]]
| style="text-align:left;"| Opened 1960.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Pacheco Truck Assembly and Painting Plant
| style="text-align:left;"| [[w:General Pacheco|General Pacheco]], [[w:Buenos Aires Province|Buenos Aires Province]]
| style="text-align:left;"| [[w:Argentina|Argentina]]
| style="text-align:center;"| Transferred to VW when Autolatina dissolved (1996)
| style="text-align:left;"| [[w:Ford F-Series|Ford F-100/F-150]]<br />[[w:Ford F-Series|Ford F-250/F-350/F-400/F-4000]]<br />[[w:Ford F-Series (medium duty truck)|Ford F-600/F-6000/F-700/F-7000]]
| style="text-align:left;"| Opened in 1982. Part of [[w:Autolatina|Autolatina]] joint venture with VW from 1987 to 1996. VW kept this side of the Pacheco plant when Autolatina dissolved and converted it to car production. VW has since then used this plant for Amarok pickup truck production.
|- style="vertical-align:top;"
| style="text-align:center;"| U (EU) [when following L]
| style="text-align:left;"| [[w:Pininfarina|Pininfarina Bairo Assembly]]
| style="text-align:left;"| [[w:Bairo|Bairo]]
| style="text-align:left;"| [[w:Italy|Italy]]
| style="text-align:center;"| Closed (2010)
| [[w:Ford Focus (second generation, Europe)#Coupé-Cabriolet|Ford Focus Coupe-Cabriolet]]<br />[[w:Ford Ka#StreetKa and SportKa|Ford StreetKa]]
| Plant owned by [[w:Pininfarina|Pininfarina]]
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Piquette Avenue Plant|Piquette Avenue Plant]]
| style="text-align:left;"| [[w:Detroit|Detroit, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Sold (1911), reopened as a museum (2001)
| style="text-align:left;"| Models [[w:Ford Model B (1904)|B]], [[w:Ford Model C|C]], [[w:Ford Model F|F]], [[w:Ford Model K|K]], [[w:Ford Model N|N]], [[w:Ford Model N#Model R|R]], [[w:Ford Model S|S]], and [[w:Ford Model T|T]]
| style="text-align:left;"| 1904–1910. Ford Motor Company's second American factory (first owned). Concept of a moving assembly line experimented with and developed here before being fully implemented at Highland Park plant. Birthplace of the [[w:Ford Model T|Model T]] (September 27, 1908). Sold to [[w:Studebaker|Studebaker]] in 1911. Sold to [[w:3M|3M]] in 1936. Sold to Cadillac Overall Company, a work clothes supplier, in 1968. Owned by Heritage Investment Company from 1989 to 2000. Sold to the Model T Automotive Heritage Complex in April 2000. Run as a museum since July 27, 2001. Oldest car factory building on Earth open to the general public. The Piquette Avenue Plant was added to the National Register of Historic Places in 2002, designated as a Michigan State Historic Site in 2003, and became a National Historic Landmark in 2006. The building has also been a contributing property for the surrounding Piquette Avenue Industrial Historic District since 2004. The factory's front façade was fully restored to its 1904 appearance and revealed to the public on September 27, 2008, the 100th anniversary of the completion of the first production Model T.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Plonsk Assembly
| style="text-align:left;"| [[w:Plonsk|Plonsk]]
| style="text-align:left;"| [[w:Poland|Poland]]
| style="text-align:center;"| Closed (2000)
| style="text-align:left;"| [[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Transit|Ford Transit]]<br />
| style="text-align:left;"| Opened in 1995.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford France|Poissy Assembly]] (now the [[w:Stellantis Poissy Plant|Stellantis Poissy Plant]])
| style="text-align:left;"| [[w:Poissy|Poissy]]
| style="text-align:left;"| [[w:France|France]]
| style="text-align:center;"| Sold in 1954 to Simca
| style="text-align:left;"| [[w:Ford SAF#Ford SAF (1945-1954)|Ford F-472/F-472A (13CV) & F-998A (22CV)]]<br />[[w:Ford Vedette|Ford Vedette]]<br />[[w:Ford Abeille|Ford Abeille]]<br />[[w:Ford Vendôme|Ford Vendôme]] <br />[[w:Ford Comèt|Ford Comète]]<br /> Ford F-198 T/F-598 T/F-698 W/Cargo F798WM/Remorqueur trucks<br />French Ford based Simca models:<br />[[w:Simca Vedette|Simca Vedette]]<br />[[w:Simca Ariane|Simca Ariane]]<br />[[w:Simca Ariane|Simca Miramas]]<br />[[w:Ford Comète|Simca Comète]]
| Ford France including the Poissy plant and all current and upcoming French Ford models was sold to [[w:Simca|Simca]] in 1954 and Ford took a 15.2% stake in Simca. In 1958, Ford sold its stake in [[w:Simca|Simca]] to [[w:Chrysler|Chrysler]]. In 1963, [[w:Chrysler|Chrysler]] increased their stake in [[w:Simca|Simca]] to a controlling 64% by purchasing stock from Fiat, and they subsequently extended that holding further to 77% in 1967. In 1970, Chrysler increased its stake in Simca to 99.3% and renamed it Chrysler France. In 1978, Chrysler sold its entire European operations including Simca to PSA Peugeot-Citroën and Chrysler Europe's models were rebranded as Talbot. Talbot production at Poissy ended in 1986 and the Talbot brand was phased out. Poissy went on to produce Peugeot and Citroën models. Poissy has therefore, over the years, produced vehicles for the following brands: [[w:Ford France|Ford]], [[w:Simca|Simca]], [[w:Chrysler Europe|Chrysler]], [[w:Talbot#Chrysler/Peugeot era (1979–1985)|Talbot]], [[w:Peugeot|Peugeot]], [[w:Citroën|Citroën]], [[w:DS Automobiles|DS Automobiles]], [[w:Opel|Opel]], and [[w:Vauxhall Motors|Vauxhall]]. Opel and Vauxhall are included due to their takeover by [[w:PSA Group|PSA Group]] in 2017 from [[w:General Motors|General Motors]].
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Recife Assembly
| style="text-align:left;"| [[w:Recife|Recife]], [[w:Pernambuco|Pernambuco]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br /> [[w:Ford Model A (1927–1931)|Ford Model A]]<br />
| Opened 1925. Brazilian branch assembly plant.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Automotive industry in Australia#Renault Australia|Renault Australia]]
| style="text-align:left;"| [[w:Heidelberg, Victoria|Heidelberg]], [[w:Victoria (Australia)|Victoria]]
| style="text-align:left;"| [[w:Australia|Australia]]
| style="text-align:center;"| Factory closed in 1981
| style="text-align:left;"| [[w:Ford Cortina#Mark IV (1976–1979)|Ford Cortina wagon]]
| Assembled by Renault Australia under a 3-year contract to [[w:Ford Australia|Ford Australia]] beginning in 1977.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Romania#20th century|Ford Română S.A.R.]]
| style="text-align:left;"| [[w:Bucharest|Bucharest]]
| style="text-align:left;"| [[w:Romania|Romania]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Model 48|Ford Model 48/Model 68]] (1935-1936)<br /> [[w:1937 Ford|Ford Model 74/78/81A/82A/91A/92A/01A/02A]] (1937-1940)<br />[[w:Mercury Eight|Mercury Eight]] (1939-1940)<br />
| Production ended in 1940 due to World War II. The factory then did repair work only. The factory was nationalized by the Communist Romanian government in 1948.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Ford Romeo Engine Plant|Romeo Engine]]
| style="text-align:left;"| [[W:Romeo, Michigan|Romeo, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (December 2022)
| style="text-align:left;"| [[w:Ford Boss engine|Ford 6.2L Boss V8]]<br /> [[w:Ford Modular engine|Ford 4.6/5.4 Modular V8]] <br />[[w:Ford Modular engine#5.8 L Trinity|Ford 5.8L supercharged Trinity V8]]<br /> [[w:Ford Modular engine#Voodoo|Ford 5.2L flat-plane crank Voodoo V8]]<br /> [[w:Ford Modular engine#Predator|Ford 5.2L supercharged Predator V8]]
| Located at 701 E. 32 Mile Road. Made Ford tractors and engines, parts, and farm implements for tractors from 1973 until 1988. Reopened in 1990 making the Modular V8. Included 2 lines: a high volume engine line and a niche engine line, which, since 1996, made high-performance V8 engines by hand including the Trinity, Voodoo, and Predator engines as well as the 32-valve 4.6L V8 in the Mustang Cobra SVT of '96-'99 & '01 and the <br> 32-valve 5.4L V8 in the '00 Mustang Cobra R and the supercharged 32-valve 4.6L V8 in the Mustang Cobra SVT of '03-'04 & the supercharged 32-valve 5.4L V8 in the Mustang Shelby GT500 of '07-'12 and the Ford GT of '05-'06.
|- style="vertical-align:top;"
| style="text-align:center;"| R (NA)
| style="text-align:left;"| [[w:San Jose Assembly Plant|San Jose Assembly Plant]]
| style="text-align:left;"| [[w:Milpitas, California|Milpitas, California]]
| style="text-align:left;"| U.S.
| style=”text-align:center;"| 1955-1983
| style="text-align:left;"| [[w:Ford F-Series|Ford F-Series]] (1955-1983), [[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1960), [[w:Ford Galaxie|Ford Galaxie]] (1959-1960), [[w:Edsel Pacer|Edsel Pacer]] (1958), [[w:Edsel Ranger|Edsel Ranger]] (1958), [[w:Edsel Roundup|Edsel Roundup]] (1958), [[w:Edsel Villager|Edsel Villager]] (1958), [[w:Edsel Bermuda|Edsel Bermuda]] (1958), [[w:Ford Pinto|Ford Pinto]] (1971-1978), [[w:Mercury Bobcat|Mercury Bobcat]] (1976, 1978), [[w:Ford Escort (North America)#First generation (1981–1990)|Ford Escort]] (1982-1983), [[w:Ford EXP|Ford EXP]] (1982-1983), [[w:Mercury Lynx|Mercury Lynx]] (1982-1983), [[w:Mercury LN7|Mercury LN7]] (1982-1983), [[w:Ford Falcon (North America)|Ford Falcon]] (1961-1964), [[w:Mercury Comet#First generation (1960–1963)|Comet]] (1961), [[w:Mercury Comet|Mercury Comet]] (1962), [[w:Ford Fairlane (Americas)|Ford Fairlane (midsize)]] (1962-1964, 1969-1970), [[w:Ford Torino|Ford Torino]] (1969-1970), [[w:Ford Ranchero|Ford Ranchero]] (1957-1964, 1970), [[w:Mercury Montego|Mercury Montego]], [[w:Ford Mustang|Ford Mustang]] (1965-1970, 1974-1981), [[w:Mercury Cougar|Mercury Cougar]] (1968-1969), & [[w:Mercury Capri#Second generation (1979–1986)|Mercury Capri]] (1979-1981).
| style="text-align:left;"| Replaced the Richmond Assembly Plant. Was northwest of the intersection of Great Mall Parkway/Capitol Avenue and Montague Expressway extending west to S. Main St. (in Milpitas). Site is now Great Mall of the Bay Area.
|-
|
| style="text-align:left;"| San Lazaro Assembly Plant
| style="text-align:left;"| San Lazaro, [[w:Mexico City|Mexico City]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;" | Operated 1925-c.1932
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]]
| First auto plant in Mexico opened in 1925. Replaced by La Villa plant in 1932.
|-
| style="text-align:center;"| T (EU) [when following M]
| [[w:Ford India|Sanand Vehicle Assembly Plant]]
| [[w:Sanand|Sanand]], [[w:Gujarat|Gujarat]]
| [[w:India|India]]
| style="text-align:center;"| Closed (2021)<ref name=":0"/> Sold to [[w:Tata Motors|Tata Motors]] in 2022.
| style="text-align:left;"| [[w:Ford Figo#Second generation (B562; 2015)|Ford Figo]]<br />[[w:Ford Figo Aspire|Ford Figo Aspire]]<br />[[w:Ford Figo#Freestyle|Ford Freestyle]]
| Opened March 2015<ref name="sanand">{{cite web|title=News|url=https://www.at.ford.com/en/homepage/news-and-clipsheet/news.html|website=www.at.ford.com}}</ref>
|-
|
| Santiago Exposition Street Plant
(Planta Calle Exposición 1258)
| [[w:es:Calle Exposición|Calle Exposición]], [[w:Santiago, Chile|Santiago, Chile]]
| [[w:Chile|Chile]]
| style="text-align:center;" |Operated 1924-c.1962
<ref>{{Cite web |last=U |first=Juan Ignacio Alamos |date=2013-04-10 |title=AUTOS CHILENOS: PLANTA FORD CALLE EXPOSICIÓN (1924 - c.1962) |url=https://autoschilenos.blogspot.com/2013/04/planta-ford-calle-exposicion-1924-c1962.html |access-date=2022-08-04 |website=AUTOS CHILENOS}}</ref><ref name=":1" />
| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:Ford F-Series|Ford F-Series]]
| First plant opened in Chile in 1924.<ref name=":2" />
|- style="vertical-align:top;"
| style="text-align:center;"| B (SA)
| style="text-align:left;"| [[w:Ford Brasil|São Bernardo Assembly]]
| style="text-align:left;"| [[w:São Bernardo do Campo|São Bernardo do Campo]], [[w:São Paulo (state)|São Paulo (state)]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Closed Oct. 30, 2019 & Sold 2020 <ref>{{Cite news|url=https://www.reuters.com/article/us-ford-motor-southamerica-heavytruck-idUSKCN1Q82EB|title=Ford to close oldest Brazil plant, exit South America truck biz|date=2019-02-20|work=Reuters|access-date=2019-03-07|language=en}}</ref>
| style="text-align:left;"| [[w:Ford Fiesta|Ford Fiesta]]<br /> [[w:Ford Cargo|Ford Cargo]] Trucks<br /> [[w:Ford F-Series|Ford F-Series]]
| Originally the Willys-Overland do Brazil plant. Bought by Ford in 1967. Part of [[w:Autolatina|Autolatina]] joint venture with VW from 1987 to 1996. No more Cargo Trucks produced in Brazil since 2019. Sold to Construtora São José Desenvolvimento Imobiliária.<br />Previously:<br />[[w:Willys Aero#Brazilian production|Ford Aero]]<br />[[w:Ford Belina|Ford Belina]]<br />[[w:Ford Corcel|Ford Corcel]]<br />[[w:Ford Del Rey|Ford Del Rey]]<br />[[w:Willys Aero#Brazilian production|Ford Itamaraty]]<br />[[w:Jeep CJ#Brazil|Ford Jeep]]<br /> [[w:Ford Rural|Ford Rural]]<br />[[w:Ford F-75|Ford F-75]]<br />[[w:Ford Maverick (1970–1977)|Ford Maverick]]<br />[[w:Ford Pampa|Ford Pampa]]<br />[[w:Ford Courier#Brazil (1998–2013)|Ford Courier]]<br />[[w:Ford Ka|Ford Ka]] (BE146 & B402)<br />[[w:Ford Escort (Europe)|Ford Escort]]<br />[[w:Ford Orion|Ford Orion]]<br />[[w:Ford Verona|Ford Verona]]<br />[[w:Volkswagen Apollo|Volkswagen Apollo]]<br />[[w:Volkswagen Logus|Volkswagen Logus]]<br />[[w:Volkswagen Pointer|Volkswagen Pointer]]<br />Ford tractors
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:pt:Ford do Brasil|São Paulo city assembly plants]]
| style="text-align:left;"| [[w:São Paulo|São Paulo]], [[w:São Paulo (state)|São Paulo (state)]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br /> [[w:Ford Model A (1927–1931)|Ford Model A]]<br /> [[w:1932 Ford|1932 Ford]]<br />Ford tractors
| First plant opened in 1919 on Rua Florêncio de Abreu, in São Paulo. Moved to a larger plant in Praça da República in São Paulo in 1920. Then moved to an even larger plant on Rua Solon, in the Bom Retiro neighborhood of São Paulo in 1921. Replaced by Ipiranga plant in 1953.
|- style="vertical-align:top;"
| style="text-align:center;"| L (NZ)
| style="text-align:left;"| Seaview Assembly Plant
| style="text-align:left;"| [[w:Lower Hutt|Lower Hutt]]
| style="text-align:left;"| [[w:New Zealand|New Zealand]]
| style="text-align:center;"| Closed (1988)
| style="text-align:left;"| [[w:Ford Model 48#1936|Ford Model 68]]<br />[[w:1937 Ford|1937 Ford]] Model 78<br />[[w:Ford Model Y|Ford Model Y]]<br />[[w:Ford Model C Ten|Ford Model C Ten]]<br />[[w:Ford 7W|Ford 7W]]<br />[[w:Ford Anglia|Ford Anglia]]<br />[[w:Ford Prefect|Ford Prefect]]<br />[[w:Ford Consul Capri|Ford Consul Classic 315]]<br />[[w:Ford Consul|Ford Consul]]<br />[[w:Ford Zephyr|Ford Zephyr]]<br /> [[w:Ford Zodiac|Ford Zodiac]]<br /> [[w:Ford Pilot|Ford Pilot]]<br />[[w:1949 Ford|Ford Custom V8 Fordor]]<br /> [[w:Ford Escort (Europe)|Ford Escort]]<br /> [[w:Ford Cortina|Ford Cortina]]<br /> [[w:Ford Sierra|Ford Sierra]] wagon<br />[[w:Ford Telstar|Ford Telstar]]<br />[[w:Ford Falcon (Australia)|Ford Falcon]]<br />[[w:Ford Thames 400E|Ford Thames 400E]]<br />[[w:Ford Transit#First generation (1965)|Ford Transit]]<br />[[w:Fordson|Fordson]] Major tractors
| style="text-align:left;"| Opened in 1936, closed in 1988
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Sheffield Aluminum Casting Plant
| style="text-align:left;"| [[w:Sheffield, Alabama|Sheffield, Alabama]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (1983)
| style="text-align:left;"| Die cast parts<br /> pistons<br /> transmission cases
| style="text-align:left;"| Opened in 1958, closed in December 1983. Demolished 2008.
|- style="vertical-align:top;"
| style="text-align:center;"| J (EU) [when following B]
| style="text-align:left;"| Shenstone plant
| style="text-align:left;"| [[w:Shenstone, Staffordshire|Shenstone, Staffordshire]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (1986)
| style="text-align:left;"| [[w:Ford RS200|Ford RS200]]
| style="text-align:left;"| Former [[w:Reliant Motors|Reliant Motors]] plant. Leased by Ford from 1985-1986 to build the RS200.
|- style="vertical-align:top;"
| style="text-align:center;"| D (EU) [when following B]
| style="text-align:left;"| [[w:Ford Southampton plant|Southampton Body & Assembly]]
| style="text-align:left;"| [[w:Southampton|Southampton]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed (2013)<ref name="End of an era"/>
| style="text-align:left;"| [[w:Ford Transit|Ford Transit]] van
| style="text-align:left;"| Former Supermarine aircraft factory, acquired 1953. Built Ford vans 1972 – July 2013
|- style="vertical-align:top;"
| style="text-align:center;"| SL/Z (NA)
| style="text-align:left;"| [[w:St. Louis Assembly|St. Louis Assembly]]
| style="text-align:left;"| [[w:Hazelwood, MO|Hazelwood, MO]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1948-2006
| style="text-align:left;"| [[w:Ford Explorer|Ford Explorer]] (1995-2006)<br>[[w:Mercury Mountaineer|Mercury Mountaineer]] (2002-2006)<br>[[w:Lincoln Aviator#First generation (UN152; 2003)|Lincoln Aviator]] (2003-2005)
| style="text-align:left;"| Located at 2-58 Ford Lane and Aviator Dr. St. Louis plant is now a mixed use residential/commercial space (West End Lofts). Hazelwood plant was demolished in 2009.<br /> Previously:<br /> [[w:Ford Aerostar|Ford Aerostar]] (1986-1997)<br /> [[w:Ford LTD Crown Victoria|Ford LTD Crown Victoria]] (1983-1985) <br />[[w:Ford LTD (Americas)|Ford LTD]]<br />[[w:Ford Galaxie|Ford Galaxie]]<br> [[w:Mercury Grand Marquis|Mercury Grand Marquis]] (1983-1985)<br />[[w:Mercury Marquis|Mercury Marquis]] (1967-1982)<br />[[w:Mercury Marquis#Third generation (1979–1982)|Mercury Marquis Meteor (Canada only)]] (1980-81)<br /> [[w:Mercury Marauder|Mercury Marauder]] <br />[[w:Mercury Medalist|Mercury Medalist]] (1956, 1958)<br /> [[w:Mercury Monterey|Mercury Monterey]] (1952-1970, 1974)<br>[[w:Mercury Montclair|Mercury Montclair]] (1955-1960, 1964-1968)<br />[[w:Mercury S-55|Mercury S-55]] (1962-1963, 1966-1967)<br>[[w:Mercury Park Lane|Mercury Park Lane]] (1959, 1964-1968)<br />[[w:Mercury Turnpike Cruiser|Mercury Turnpike Cruiser]] (1957-1958)<br>[[w:Mercury Eight|Mercury Eight]] (1950-1951)<br /> [[w:Mercury Custom|Mercury Custom]] (1952-1953)
|- style="vertical-align:top;"
| style="text-align:center;"| X (NA)
| style="text-align:left;"| [[w:St. Thomas Assembly|St. Thomas Assembly]]
| style="text-align:left;"| [[w:Talbotville, Ontario|Talbotville, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| Closed (2011)<ref>{{cite news|url=https://www.theglobeandmail.com/investing/markets/|title=Markets|website=The Globe and Mail}}</ref>
| style="text-align:left;"| [[w:Ford LTD Crown Victoria|Ford LTD Crown Victoria]] (1984-1991) <br />[[w:Ford Crown Victoria|Ford Crown Victoria]] (1992-2011)<br /> [[w:Mercury Grand Marquis|Mercury Grand Marquis]] (1984-2011)<br />[[w:Mercury Marauder#Third generation (2003–2004)|Mercury Marauder]] (2003-2004)<br /> [[w:Lincoln Town Car#Third generation (FN145; 1998–2011)|Lincoln Town Car]] (2008-2011)
| style="text-align:left;"| Opened in 1967. Demolished. Now an Amazon fulfillment center.<br /> Previously:<br /> [[w:Ford Falcon (North America)|Ford Falcon]] (1968-1969)<br />[[w:Ford Maverick (1970–1977)|Ford Maverick]] (1970-77) <br />[[w:Ford Pinto|Ford Pinto]] (1971, 1973-1977, 1980)<br />[[w:Mercury Bobcat|Mercury Bobcat]] (1980)<br />[[w:Ford Fairmont|Ford Fairmont]] (1978-81)<br />[[w:Mercury Zephyr|Mercury Zephyr]] (1978-81) <br />[[w:Ford EXP|Ford EXP]] (1982-1983)<br />[[w:Mercury LN7|Mercury LN7]] (1982-1983)
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Stockholm Assembly
| style="text-align:left;"| Free Port area (Frihamnen in Swedish), [[w:Stockholm|Stockholm]]
| style="text-align:left;"| [[w:Sweden|Sweden]]
| style="text-align:center;"| Closed (1957)
| style="text-align:left;"| [[w:Ford Consul|Ford Consul]]<br />[[w:Ford Prefect|Ford Prefect]]<br />[[w:Ford Vedette|Ford Vedette]]<br />Ford trucks
| style="text-align:left;"|
|- style="vertical-align:top;"
| style="text-align:center;"| 5
| style="text-align:left;"| [[w:Swedish Motor Assemblies|Swedish Motor Assemblies]]
| style="text-align:left;"| [[w:Kuala Lumpur|Kuala Lumpur]]
| style="text-align:left;"| [[w:Malaysia|Malaysia]]
| style="text-align:center;"| Sold 2010
| style="text-align:left;"| [[w:Volvo S40|Volvo S40]]<br />[[w:Volvo S40#First generation (1995–2004)|Volvo V40]]<br />[[w:Volvo V50|Volvo V50]]<br />[[w:Volvo S60|Volvo S60]]<br />[[w:Volvo S70|Volvo S70]]<br />[[w:Volvo S80|Volvo S80]]<br />[[w:Volvo V70|Volvo V70]]<br />[[w:Volvo XC90|Volvo XC90]]<br />[[w:Land Rover Defender|Land Rover Defender]]<br />[[w:Land Rover Discovery|Land Rover Discovery]]<br />[[w:Land Rover Freelander|Land Rover Freelander]]
| style="text-align:left;"| Also built Volvo trucks and buses. Used to do contract assembly for other automakers including Suzuki and Daihatsu. Volvo Cars was sold to [[w:Geely|Zhejiang Geely Holding Group Co., Ltd.]] in 2010.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Sydhavnen Assembly
| style="text-align:left;"| [[w:Sydhavnen|Sydhavnen district]], [[w:Copenhagen|Copenhagen]]
| style="text-align:left;"| [[w:Denmark|Denmark]]
| style="text-align:center;"| Closed (1966)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:Ford Model Y|Ford Junior]]<br />[[w:Ford Model C (Europe)|Ford Junior De Luxe]]<br />[[w:Ford Eifel|Ford Eifel]]<br />[[w:Ford Taunus|Ford Taunus]]<br />[[w:Ford Anglia|Ford Anglia]]<br />[[w:Ford Thames 400E|Ford Thames 400E]]
| style="text-align:left;"| 1924–1966. 325,482 vehicles were built. Plant was then converted into a tractor assembly plant for Ford Industrial Equipment Co. Tractor plant closed in the mid-1970's. Administration & depot building next to assembly plant was used until 1991 when depot for remote storage closed & offices moved to Glostrup. Assembly plant building stood until 2006 when it was demolished.
|-
|
| style="text-align:left;"| [[w:Ford Brasil|Taubate Engine & Transmission & Chassis Plant]]
| style="text-align:left;"| [[w:Taubaté, São Paulo|Taubaté, São Paulo]], Av. Charles Schnneider, 2222
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Closed 2021<ref name="camacari"/> & Sold 05.18.2022
| [[w:Ford Pinto engine#2.3 (LL23)|Ford Pinto/Lima 2.3L I4]]<br />[[w:Ford Sigma engine#Zetec RoCam|Ford Zetec RoCam engine]]<br />[[w:Ford Sigma engine#Brazil|Ford Sigma engine]]<br />[[w:List of Ford engines#1.5 L Dragon|1.5L Ti-VCT Dragon 3-cyl.]]<br />[[w:Ford BC-series transmission#iB5 Version|iB5 5-speed manual transmission]]<br />MX65 5-speed manual transmission<br />aluminum casting<br />Chassis components
| Opened in 1974. Sold to Construtora São José Desenvolvimento Imobiliária https://construtorasaojose.com<ref>{{Cite news|url=https://www.focus.jor.br/ford-vai-vender-fabrica-de-sp-para-construtora-troller-segue-sem-definicao/|title=Ford sold Factory in Taubaté to Buildings Development Constructor|date=2022-05-18|access-date=2022-05-29|language=pt}}</ref>
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:AutoAlliance Thailand#History|Thai Motor Co.]]
| style="text-align:left;"| ?
| style="text-align:left;"| [[w:Thailand|Thailand]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Cortina|Ford Cortina]]
| Factory was a joint venture between Ford UK & Ford's Thai distributor, Anglo-Thai Motors Company. Taken over by Ford in 1973 when it was renamed Ford Thailand, closed in 1976 when Ford left Thailand.
|- style="vertical-align:top;"
| style="text-align:center;"| 4
| style="text-align:left;"| [[w:List of Volvo Car production plants|Thai-Swedish Assembly Co. Ltd.]]
| style="text-align:left;"| [[w:Samutprakarn|Samutprakarn]]
| style="text-align:left;"| [[w:Thailand|Thailand]]
| style="text-align:center;"| Plant no longer used by Volvo Cars. Sold to Volvo AB in 2008. Volvo Car production ended in 2011. Production consolidated to Malaysia plant in 2012.
| style="text-align:left;"| [[w:Volvo 200 Series|Volvo 200 Series]]<br />[[w:Volvo 940|Volvo 940]]<br />[[w:Volvo S40|Volvo S40/V40]]<br />[[w:Volvo S70|Volvo S70]]<br />[[w:Volvo S60|Volvo S60]]<br />[[w:Volvo S80|Volvo S80]]<br />[[w:Volvo V70|Volvo V70]]<br />[[w:Volvo XC90|Volvo XC90]]<br />[[w:Land Rover Freelander#First generation (L314; 1997–2006)|Land Rover Freelander]]<br />Volvo Trucks<br />Volvo Buses
| Was 56% owned by Volvo and 44% owned by Swedish Motor. Volvo Cars was sold to [[w:Geely|Zhejiang Geely Holding Group Co., Ltd.]] in 2010.
|- style="vertical-align:top;"
| style="text-align:center;"| J
| style="text-align:left;"| [[w:Think Global|TH!NK Nordic AS]]
| style="text-align:left;"| [[w:Aurskog|Aurskog]]
| style="text-align:left;"| [[w:Norway|Norway]]
| style="text-align:center;"| Sold (2003)
| style="text-align:left;"| [[w:Ford Think City|Ford Think City]]
| style="text-align:left;"| Sold to Kamkorp Microelectronics as of February 1, 2003
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Tlalnepantla Tool & Die
| style="text-align:left;"| [[w:Tlalnepantla|Tlalnepantla]], [[w:Mexico State|Mexico State]]
| style="text-align:left;"| [[w:Mexico|Mexico]]
| style="text-align:center;"| Closed 1985
| style="text-align:left;"| Tooling for vehicle production
| Was previously a Studebaker-Packard assembly plant. Bought by Ford in 1962 and converted into a tool & die plant. Operations transferred to Cuautitlan at the end of 1985.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Ford Trafford Park Factory|Ford Trafford Park Factory]]
| style="text-align:left;"| [[w:Trafford Park|Trafford Park]]
| style="text-align:left;"| [[w:England|England]], [[w:UK|UK]]
| style="text-align:center;"| Closed
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]]
| style="text-align:left;"| 1911–1931, formerly principal Ford UK plant. Produced [[w:Rolls-Royce Merlin|Rolls-Royce Merlin]] aircraft engines during World War II.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Transax, S.A.
| style="text-align:left;"| [[w:Córdoba, Argentina|Córdoba]], [[w:Córdoba Province, Argentina|Córdoba Province]]
| style="text-align:left;"| [[w:Argentina|Argentina]]
| style="text-align:center;"| Transferred to VW when Autolatina dissolved (1996)
| style="text-align:left;"| Transmissions <br /> Axles
| style="text-align:left;"| Bought by Ford in 1967 from [[w:Industrias Kaiser Argentina|IKA]]. Part of [[w:Autolatina|Autolatina]] joint venture with VW from 1987 to 1996. VW kept this plant when Autolatina dissolved. VW has since then used this plant for transmission production.
|-
| style="text-align:center;"| H (SA)
| style="text-align:left;"|[[w:Troller Veículos Especiais|Troller Veículos Especiais]]
| style="text-align:left;"| [[w:Horizonte, Ceará|Horizonte, Ceará]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Acquired in 2007; operated until 2021. Closed (2021).<ref name="camacari"/>
| [[w:Troller T4|Troller T4]], [[w:Troller Pantanal|Troller Pantanal]]
|
|- style="vertical-align:top;"
| style="text-align:center;"| P (NA)
| style="text-align:left;"| [[w:Twin Cities Assembly Plant|Twin Cities Assembly Plant]]
| style="text-align:left;"| [[w:Saint Paul, Minnesota|St. Paul]], MN
| style="text-align:left;"| U.S.
| style="text-align:center;"| Operated from 1925 to 2011
| style="text-align:left;"| [[w:Ford Ranger (Americas)|Ford Ranger]] (1986-2011)<br />[[w:Ford Ranger (Americas)#Mazda B-Series/Mazda Truck (1994–2010)|Mazda B-Series]] (2005-2009 & 2010 in Canada)
| style="text-align:left;"|Located at 966 S. Mississippi River Blvd. Began production May 4, 1925. Production ended December 1932 but resumed in 1935. Closed December 16, 2011. <br>Previously: [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]], [[w:1957 Ford|1957 Ford]], [[w:Ford Fairlane (Americas)|Ford Fairlane (full-size)]] (1960-1961), [[w:Ford Galaxie|Ford Galaxie]] (1959-1972, 1974), [[w:Ford 300|Ford 300]] (1963), [[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1964, 1966, 1976), [[w:Ford LTD (Americas)|Ford LTD]] (1967-1970, 1972-1973, 1975, 1977-1978), [[w:Ford F-Series|Ford F-Series]] (1951-1992) <br /> [[w:Ford F-Series (medium-duty truck)#Second generation (1953–1956)|Ford F-Series (medium-duty truck)]] (1954)<br />From 1926-1959, there was an onsite glass plant making glass for vehicle windows. Plant closed in 1933, reopened in 1935 with glass production resuming in 1937. Truck production began in 1950 alongside car production. Car production ended in 1978. F-Series production ended in 1992. Ranger production began in 1985 for the 1986 model year.
|- style="vertical-align:top;"
| style="text-align:center;"| J (SA)
| style="text-align:left;"| [[w:Valencia Assembly|Valencia Assembly]]
| style="text-align:left;"| [[w:Valencia, Venezuela|Valencia]], [[w:Carabobo|Carabobo]]
| style="text-align:left;"| [[w:Venezuela|Venezuela]]
| style="text-align:center;"| Opened 1962, Production suspended around 2019
| style="text-align:left;"| Previously built <br />[[w:Ford Bronco|Ford Bronco]] <br /> [[w:Ford Corcel|Ford Corcel]] <br />[[w:Ford Explorer|Ford Explorer]] <br />[[w:Ford Torino#Venezuela|Ford Fairlane (Gen 1)]]<br />[[w:Ford LTD II#Venezuela|Ford Fairlane (Gen 2)]]<br />[[w:Ford Fiesta (fifth generation)|Ford Fiesta Move]], [[w:Ford Fiesta|Ford Fiesta]]<br />[[w:Ford Focus|Ford Focus]]<br /> [[w:Ford Ka|Ford Ka]]<br />[[w:Ford LTD (Americas)#Venezuela|Ford LTD]]<br />[[w:Ford LTD (Americas)#Fourth generation (1983–1986)|Ford Granada]]<br />[[w:Mercury Marquis#Fourth generation (1983–1986)|Ford Cougar]]<br />[[w:Ford Laser|Ford Laser]] <br /> [[w:Ford Maverick (1970–1977)|Ford Maverick]] <br />[[w:Ford Mustang (first generation)|Ford Mustang]] <br /> [[w:Ford Sierra|Ford Sierra]]<br />[[w:Mazda Allegro|Mazda Allegro]]<br />[[w:Ford F-250|Ford F-250]]<br /> [[w:Ford F-350|Ford F-350]]<br /> [[w:Ford Cargo|Ford Cargo]]
| style="text-align:left;"| Served Ford markets in Colombia, Ecuador and Venezuela. Production suspended due to collapse of Venezuela’s economy under Socialist rule of Hugo Chavez & Nicolas Maduro.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| [[w:Autolatina|Volkswagen São Bernardo Assembly]] ([[w:Volkswagen do Brasil|Anchieta]])
| style="text-align:left;"| [[w:São Bernardo do Campo|São Bernardo do Campo]], [[w:São Paulo (state)|São Paulo (state)]]
| style="text-align:left;"| [[w:Brazil|Brazil]]
| style="text-align:center;"| Returned to VW do Brazil when Autolatina dissolved in 1996
| style="text-align:left;"| [[w:Ford Versailles|Ford Versailles]]/Ford Galaxy (Argentina)<br />[[w:Ford Royale|Ford Royale]]<br />[[w:Volkswagen Santana#Santana (Brazil; 1984–2006)|Volkswagen Santana]]<br />[[w:Volkswagen Santana#Santana (Brazil; 1984–2006)|Volkswagen Quantum]]
| Part of [[w:Autolatina|Autolatina]] joint venture between Ford and VW from 1987 to 1996.
|- style="vertical-align:top;"
| style="text-align:center;"| J
| style="text-align:left;"| [[w:List of Volvo Car production plants|Volvo AutoNova Plant]]
| style="text-align:left;"| [[w:Uddevalla|Uddevalla]]
| style="text-align:left;"| [[w:Sweden|Sweden]]
| style="text-align:center;"| Sold to Pininfarina Sverige AB
| style="text-align:left;"| [[w:Volvo C70#First generation (1996–2005)|Volvo C70]] (Gen 1)
| style="text-align:left;"| AutoNova was originally a 49/51 joint venture between Volvo & [[w:Tom Walkinshaw Racing|TWR]]. Restructured into Pininfarina Sverige AB, a new joint venture with [[w:Pininfarina|Pininfarina]] to build the 2nd generation C70.
|- style="vertical-align:top;"
| style="text-align:center;"| 2
| style="text-align:left;"| [[w:Volvo Car Gent|Volvo Ghent Plant]]
| style="text-align:left;"| [[w:Ghent|Ghent]]
| style="text-align:left;"| [[w:Belgium|Belgium]]
| style="text-align:center;"| Sold
| style="text-align:left;"| [[w:Volvo C30|Volvo C30]]<br />[[w:Volvo S40#Second generation (2004–2012)|Volvo S40]]<br />[[w:Volvo S60|Volvo S60]]<br />[[w:Volvo S70|Volvo S70]]<br />[[w:Volvo V40 (2012–2019)|Volvo V40]]<br />[[w:Volvo V50|Volvo V50]]<br />[[w:Volvo V70|Volvo V70]]<br />[[w:Volvo V70/XC70|Volvo XC70]] <br /> [[w:Volvo XC60|Volvo XC60]]
| style="text-align:left;"| Sold as part of sale of Volvo Cars to [[w:Geely|Zhejiang Geely Holding Group Co., Ltd.]] in 2010
|- style="vertical-align:top;"
| style="text-align:center;"| F
| style="text-align:left;"| [[w:NedCar|Volvo Nedcar Plant]]
| style="text-align:left;"| [[w:Born, Netherlands|Born]]
| style="text-align:left;"| [[w:Netherlands|Netherlands]]
| style="text-align:center;"| Sold (2001)
| style="text-align:left;"| [[w:Volvo S40#First generation (1995–2004)|Volvo S40]]<br />[[w:Volvo S40#First generation (1995–2004)|Volvo V40]]<br />[[w:Mitsubishi Carisma|Mitsubishi Carisma]] <br /> [[w:Mitsubishi Space Star|Mitsubishi Space Star]]
| style="text-align:left;"| Taken over by [[w:Mitsubishi Motors|Mitsubishi Motors]] in 2001, and later by [[w:VDL Groep|VDL Groep]] in 2012, when it became VDL Nedcar. Volvo production ended in 2004.
|- style="vertical-align:top;"
| style="text-align:center;"| J
| style="text-align:left;"| [[w:Pininfarina#Uddevalla, Sweden Pininfarina Sverige AB|Volvo Pininfarina Sverige Plant]]
| style="text-align:left;"| [[w:Uddevalla|Uddevalla]]
| style="text-align:left;"| [[w:Sweden|Sweden]]
| style="text-align:center;"| Closed by Volvo after the Geely takeover
| style="text-align:left;"| [[w:Volvo C70#Second generation (2006–2013)|Volvo C70]] (Gen 2)
| style="text-align:left;"| Pininfarina Sverige was a 40/60 joint venture between Volvo & [[w:Pininfarina|Pininfarina]]. Sold by Ford as part of sale of Volvo Cars to [[w:Geely|Zhejiang Geely Holding Group Co., Ltd.]] in 2010. Volvo bought back Pininfarina's shares in 2013 and closed the Uddevalla plant after C70 production ended later in 2013.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Volvo Skövde Engine Plant
| style="text-align:left;"| [[w:Skövde|Skövde]]
| style="text-align:left;"| [[w:Sweden|Sweden]]
| style="text-align:center;"| Sold
| style="text-align:left;"| [[w:Volvo Modular engine|Volvo Modular engine]] I4/I5/I6<br />[[w:Volvo D5 engine|Volvo D5 engine]]<br />[[w:Ford Duratorq engine#2005 TDCi (PSA DW Based)|PSA/Ford-based 2.0/2.2 diesel I4]]<br />
| style="text-align:left;"| Sold as part of sale of Volvo Cars to [[w:Geely|Zhejiang Geely Holding Group Co., Ltd.]] in 2010
|- style="vertical-align:top;"
| style="text-align:center;"| 1
| style="text-align:left;"| [[w:Torslandaverken|Volvo Torslanda Plant]]
| style="text-align:left;"| [[w:Torslanda|Torslanda]]
| style="text-align:left;"| [[w:Sweden|Sweden]]
| style="text-align:center;"| Sold
| style="text-align:left;"| [[w:Volvo S60|Volvo S60]]<br />[[w:Volvo S70|Volvo S70]]<br />[[w:Volvo S80|Volvo S80]]<br />[[w:Volvo V60|Volvo V60]]<br />[[w:Volvo V70|Volvo V70]]<br />[[w:Volvo V70/XC70|Volvo XC70]] <br /> [[w:Volvo XC90|Volvo XC90]]
| style="text-align:left;"| Sold as part of sale of Volvo Cars to [[w:Geely|Zhejiang Geely Holding Group Co., Ltd.]] in 2010
|- style="vertical-align:top;"
|
| style="text-align:left;"| Vulcan Forge
| style="text-align:left;"| [[w:Dearborn, Michigan|Dearborn, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Closed (2003)
| style="text-align:left;"| Connecting rods and rod cap forgings
|
|- style="vertical-align:top;"
| style="text-align:center;"| H (NA)
| style="text-align:left;"| [[w:Ford Walkerville Plant|Walkerville Plant]]
| style="text-align:left;"| [[w:Windsor, Ontario|Windsor, Ontario]] (Walkerville was taken over by Windsor in Sept. 1929)
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| Closed (1953) and vacant land next to Detroit River (Fleming Channel). Replaced by Oakville Assembly.
| style="text-align:left;"| [[w:Ford Model C|Ford Model C]]<br />[[w:Ford Model N|Ford Model N]]<br />[[w:Ford Model K|Ford Model K]]<br />[[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:Ford Model 48|Ford Model 48]]<br />[[w:1937 Ford|1937 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />1946-1947 Mercury trucks<br />[[w:1949 Ford|1949 Ford]]<br />[[w:1952 Ford|1952 Ford]]<br />[[w:Meteor (automobile)|Meteor]]<br />[[w:Monarch (marque)|Monarch]]<br />[[w:Ford F-Series|Ford F-Series]]<br />[[w:Mercury M-Series|Mercury M-Series]] (1948-1953)
| style="text-align:left;"| 1904–1953. First factory to produce Ford cars outside the USA (via [[w:Ford Motor Company of Canada|Ford Motor Company of Canada]], a separate company from Ford at the time).
|- style="vertical-align:top;"
|
| style="text-align:left;"| Walton Hills Stamping
| style="text-align:left;"| [[w:Walton Hills, Ohio|Walton Hills, Ohio]]
| style="text-align:left;"| U.S.
| style="text-align:center;"|Closed Winter 2014
| style="text-align:left;"| Body panels, bumpers
| Opened in 1954. Located at 7845 Northfield Rd. Demolished. Site is now the Forward Innovation Center East.
|- style="vertical-align:top;"
| style="text-align:center;"| WA/W (NA)
| style="text-align:left;"| [[w:Wayne Stamping & Assembly|Wayne Stamping & Assembly]]
| style="text-align:left;"| [[w:Wayne, Michigan|Wayne, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| 1952-2010
| style="text-align:left;"| [[w:Ford Focus|Ford Focus]] (2000-2011)<br /> [[w:Ford Escort (North America)|Ford Escort]] (1981-1999)<br />[[w:Mercury Tracer|Mercury Tracer]] (1996-1999)<br />[[w:Mercury Lynx|Mercury Lynx]] (1981-1987)<br />[[w:Ford EXP|Ford EXP]] (1984-1988)<br />[[w:Ford Granada (North America)#First generation (1975–1980)|Ford Granada]] (1975-1980)<br />[[w:Mercury Monarch|Mercury Monarch]] (1975-1980)<br />[[w:Lincoln Versailles|Lincoln Versailles]] (1977-1980)<br />[[w:Ford Maverick (1970–1977)|Ford Maverick]] (1974)<br />[[w:Ford Galaxie|Ford Galaxie]] (1960, 1962-1969, 1971-1972)<br />[[w:Ford 300|Ford 300]] (1963)<br />[[w:Ford Custom#Custom and Custom 500 (1964–1981)|Ford Custom/Custom 500]] (1971)<br />[[w:Ford LTD (Americas)|Ford LTD]] (1968, 1970-1972, 1974)<br />[[w:Lincoln Capri|Lincoln Capri]] (1953-1957)<br />[[w:Lincoln Cosmopolitan#Second generation (1952-1954)|Lincoln Cosmopolitan]] (1953-1954)<br />[[w:Lincoln Custom|Lincoln Custom]] (1955 only)<br />[[w:Lincoln Premiere|Lincoln Premiere]] (1956-1957)<br />[[w:Mercury Custom|Mercury Custom]] (1953-)<br />[[w:Mercury Medalist|Mercury Medalist]]<br /> [[w:Mercury Commuter|Mercury Commuter]] (1960, 1965)<br />[[w:Mercury Meteor#Full-size (1961)|Mercury Meteor]] (1961 only)<br />[[w:Mercury Monterey|Mercury Monterey]] (1953-1966)<br />[[w:Mercury Montclair|Mercury Montclair]] (1955-1958, 1964-1967)<br />[[w:Mercury Turnpike Cruiser|Mercury Turnpike Cruiser]] (1957-1958)<br />[[w:Mercury S-55|Mercury S-55]] (1962-1963, 1966)<br />[[w:Mercury Marauder|Mercury Marauder]] (1964-1965)<br />[[w:Mercury Park Lane|Mercury Park Lane]] (1958-1959, 1964-1966)<br />[[w:Edsel Corsair|Edsel Corsair]] (1958)<br />[[w:Edsel Citation|Edsel Citation]] (1958)
| style="text-align:left;"| Located at 37500 Van Born Rd. Was main production site for Mercury vehicles when plant opened in 1952 and shipped knock-down kits to dedicated Mercury assembly locations. First vehicle built was a Mercury Montclair on October 1, 1952. Built Lincolns from 1953-1957 after the Lincoln plant in Detroit closed in 1952. Lincoln production moved to a new plant in Wixom for 1958. The larger, Mercury-based Edsel Corsair and Citation were built in Wayne for 1958. The plant shifted to building smaller cars in the mid-1970's. In 1987, a new stamping plant was built on Van Born Rd. and was connected to the assembly plant via overhead tunnels. Production ended in December 2010 and the Wayne Stamping & Assembly Plant was combined with the Michigan Truck Plant, which was then renamed the [[w:Michigan Assembly Plant|Michigan Assembly Plant]].
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Willowvale Motor Industries|Willowvale Motor Industries]]
| style="text-align:left;"| [[w:Willowvale, Harare|Willowvale]], [[w:Harare|Harare]]
| style="text-align:left;"| [[w:Zimbabwe|Zimbabwe]]
| style="text-align:center;"| Ford production ended.
| style="text-align:left;"| [[w:Ford Laser#First generation (KA/KB; 1981)|Ford Laser]]<br />[[w:Mazda 323|Mazda 323]]<br />[[w:Mazda Rustler|Mazda Rustler]]<br />[[w:Mazda B series|Mazda B series]]<br />[[w:Mazda Titan#Second generation (1980–1989)|Mazda T3500]]
| style="text-align:left;"| Assembly began in 1961 as Ford of Rhodesia. Became [[w:Willowvale Motor Industries|Willowvale Motor Industries]] after the Ford sale to the state-owned Industrial Development Corporation. Became Willowvale Mazda Motor Industries from 1989 to 2014. Name went back to [[w:Willowvale Motor Industries|Willowvale Motor Industries]] in 2015.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Windsor Aluminum
| style="text-align:left;"| [[w:Windsor, Ontario|Windsor, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| Sold
| style="text-align:left;"| [[w:Ford Duratec V6 engine|Duratec V6]] engine blocks<br /> [[w:Jaguar AJ-V8 engine#3.9 L|Ford 3.9L V8]] engine blocks<br /> [[w:Ford Modular engine|Ford Modular engine]] blocks
| style="text-align:left;"| Opened 1992. Sold to Nemak Aluminum (a 25/75 joint venture between Ford & Nemak, which is 75.24% owned by Alfa Group of Mexico) in 2001. Subsequently produced engine blocks for GM. Production ended in September 2020.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Windsor Casting|Windsor Casting]]
| style="text-align:left;"| [[w:Windsor, Ontario|Windsor, Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="text-align:center;"| Closed (2007)
| style="text-align:left;"| Engine parts: Cylinder blocks, crankshafts
| Opened 1934.
|- style="vertical-align:top;"
| style="text-align:center;"| Y (NA)
| style="text-align:left;"| [[w:Wixom Assembly Plant|Wixom Assembly Plant]]
| style="text-align:left;"| [[w:Wixom, Michigan|Wixom, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Idle (2007); torn down (2013)
| style="text-align:left;"| [[w:Lincoln Continental|Lincoln Continental]] (1961-1980, 1982-2002)<br />[[w:Lincoln Continental Mark III|Lincoln Continental Mark III]] (1969-1971)<br />[[w:Lincoln Continental Mark IV|Lincoln Continental Mark IV]] (1972-1976)<br />[[w:Lincoln Continental Mark V|Lincoln Continental Mark V]] (1977-1979)<br />[[w:Lincoln Continental Mark VI|Lincoln Continental Mark VI]] (1980-1983)<br />[[w:Lincoln Continental Mark VII|Lincoln Continental Mark VII]] (1984-1992)<br />[[w:Lincoln Mark VIII|Lincoln Mark VIII]] (1993-1998)<br /> [[w:Lincoln Town Car|Lincoln Town Car]] (1981-2007)<br /> [[w:Lincoln LS|Lincoln LS]] (2000-2006)<br /> [[w:Ford GT#First generation (2005–2006)|Ford GT]] (2005-2006)<br />[[w:Ford Thunderbird (second generation)|Ford Thunderbird]] (1958-1960)<br />[[w:Ford Thunderbird (third generation)|Ford Thunderbird]] (1961-1963)<br />[[w:Ford Thunderbird (fourth generation)|Ford Thunderbird]] (1964-1966)<br />[[w:Ford Thunderbird (fifth generation)|Ford Thunderbird]] (1967-1971)<br />[[w:Ford Thunderbird (sixth generation)|Ford Thunderbird]] (1972-1976)<br />[[w:Ford Thunderbird (eleventh generation)|Ford Thunderbird]] (2002-2005)<br /> [[w:Ford GT40|Ford GT40]] MKIV<br />[[w:Lincoln Capri#Third generation (1958–1959)|Lincoln Capri]] (1958-1959)<br />[[w:Lincoln Capri#1960 Lincoln|1960 Lincoln]] (1960)<br />[[w:Lincoln Premiere#1958–1960|Lincoln Premiere]] (1958–1960)<br />[[w:Lincoln Continental#Third generation (1958–1960)|Lincoln Continental Mark III/IV/V]] (1958-1960)
| Demolished in 2012.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Ypsilanti Plant
| style="text-align:left;"| [[w:Ypsilanti, Michigan|Ypsilanti, Michigan]]
| style="text-align:left;"| U.S.
| style="text-align:center;"| Sold
| style="text-align:left;"| Starters<br /> Starter Assemblies<br /> Alternators<br /> ignition coils<br /> distributors<br /> horns<br /> struts<br />air conditioner clutches<br /> bumper shock devices
| style="text-align:left;"| Located at 128 Spring St. Originally owned by Ford Motor Company, it then became a [[w:Visteon|Visteon]] Plant when [[w:Visteon|Visteon]] was spun off in 2000, and later turned into an [[w:Automotive Components Holdings|Automotive Components Holdings]] Plant in 2005. It is said that [[w:Henry Ford|Henry Ford]] used to walk this factory when he acquired it in 1932. The Ypsilanti Plant was closed in 2009. Demolished in 2010. The UAW Local was Local 849.
|}
==Former branch assembly plants==
{| class="wikitable sortable" style="font-size:90%"
|-
! style="width:120px;"| VIN
! style="width:200px;"| Name
! style="width:100px;"| City/state
! style="width:100px;"| Country
! style="width:120px;" class="unsortable"| Status
! style="width:150px;"| Former Address
! style="width:200px;"| Products
! style="width:300px;" class="unsortable"| Comments
|- style="vertical-align:top;"
| style="text-align:center;"| A/AA
| style="text-align:left;"| [[w:Ford Motor Company Assembly Plant (Atlanta)|Atlanta Assembly Plant (Poncey-Highland)]]
| style="text-align:left;"| [[w:Poncey-Highland|Poncey-Highland, Georgia]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated 1915-1942
| style="text-align:left;"| Originally 465 Ponce de Leon Ave. but was renumbered as 699 Ponce de Leon Ave. in 1926.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]]
| style="text-align:left;"| Southeast USA headquarters and assembly operations from 1915 to 1942. Assembly ceased in 1932 but resumed in 1937. Sold to US War Dept. in 1942. Replaced by new plant in Atlanta suburb of Hapeville ([[w:Atlanta Assembly|Atlanta Assembly]]), which opened in 1947. Added to the National Register of Historic Places in 1984. Sold in 1979 and redeveloped into mixed retail/residential complex called Ford Factory Square/Ford Factory Lofts.
|- style="vertical-align:top;"
| style="text-align:center;"| BO/BF/B
| style="text-align:left;"| Buffalo Branch Assembly Plant
| style="text-align:left;"| [[w:Buffalo, New York|Buffalo, NY]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}};text-align:center;"| Original location operated from 1913 - 1915. 2nd location operated from 1915 – 1931. 3rd location operated from 1931 - 1958.
| style="text-align:left;"| Originally located at Kensington Ave. and Eire Railroad. Moved to 2495 Main St. at Rodney in December 1915. Moved to 901 Fuhmann Boulevard in 1931.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]],<br> [[w:Ford Model A (1927–1931)|Ford Model A]],<br> [[w:1932 Ford|1932 Ford]],<br> [[w:Ford Model 48|Ford Model 48]],<br> [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]], [[w:1957 Ford|1957 Ford]], [[w:Ford F-Series|Ford F-Series]] (1951-1953, 1955)
| style="text-align:left;"| Assembly ceased in January 1933 but resumed in 1934. Operations moved to Lorain, Ohio. 2495 Main St. is now the Tri-Main Center. Previously made diesel engines for the Navy and Bell Aircraft Corporation, was used by Bell Aircraft to design and construct America's first jet engine warplane, and made windshield wipers for Trico Products Co. 901 Fuhmann Boulevard used as a port terminal by Niagara Frontier Transportation Authority after Ford sold the property.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Burnaby Assembly Plant
| style="text-align:left;"| [[w:Burnaby|Burnaby, BC]]
| style="text-align:left;"| Canada
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1938 to 1960
| style="text-align:left;"| Was located at 4600 Kingsway
| style="text-align:left;"| [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]], [[w:1957 Ford|1957 Ford]]
| style="text-align:left;"| Building demolished in 1988 to build Station Square
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Cambridge Assembly|Cambridge Branch Assembly Plant]]
| style="text-align:left;"| [[w:Cambridge, Massachusetts|Cambridge, MA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1926
| style="text-align:left;"| 640 Memorial Dr. and Cottage Farm Bridge
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Had the first vertically integrated assembly line in the world. Replaced by Somerville plant in 1926. Renovated, currently home to Boston Biomedical.
|- style="vertical-align:top;"
| style="text-align:center;"| CE
| style="text-align:left;"| Charlotte Branch Assembly Plant
| style="text-align:left;"| [[w:Charlotte, North Carolina|Charlotte, NC]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated 1914-1933
| style="text-align:left;"| 222 North Tryon then moved to 210 E. Sixth St. in 1916 and again to 1920 Statesville Ave in 1924
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Closed in March 1933, Used by Douglas Aircraft to assemble missiles for the U.S. Army between 1955 and 1964, sold to Atco Properties in 2017<ref>{{cite web|url=https://ui.uncc.edu/gallery/model-ts-missiles-millennials-new-lives-old-factory|title=From Model Ts to missiles to Millennials, new lives for old factory | UNC Charlotte Urban Institute|website=ui.uncc.edu}}</ref>
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Chicago Branch Assembly Plant
| style="text-align:left;"| [[w:Chicago|Chicago]], [[w:Illinois|Illinois]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Opened in 1914<br>Moved to current location on 12600 S Torrence Ave. in 1924
| style="text-align:left;"| 3915 Wabash Avenue
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Replaced by current [[w:Chicago Assembly|Chicago Assembly Plant]] on Torrence Ave. in 1924.
|- style="vertical-align:top;"
| style="text-align:center;"| CI
| style="text-align:left;"| [[w:Ford Motor Company Cincinnati Plant|Cincinnati Branch Assembly Plant]]
| style="text-align:left;"| [[w:Cincinnati|Cincinnati, OH]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated 1915-1938
| style="text-align:left;"| 660 Lincoln Ave
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]]
| style="text-align:left;"| Added to the National Register of Historic Places in 1989, renovated 2002, currently owned by Cincinnati Children's Hospital.
|- style="vertical-align:top;"
| style="text-align:center;"| CL/CLE/CLEV
| style="text-align:left;"| Cleveland Branch Assembly Plant<ref>{{cite web |url=https://loc.gov/pictures/item/oh0114|title=Ford Motor Company, Cleveland Branch Assembly Plant, Euclid Avenue & East 116th Street, Cleveland, Cuyahoga County, OH|website=Library of Congress}}</ref>
| style="text-align:left;"| [[w:Cleveland|Cleveland, OH]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated 1915-1932
| style="text-align:left;"| 11610 Euclid Ave.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Added to the National Register of Historic Places in 1976, renovated, currently home to Cleveland Institute of Art.
|- style="vertical-align:top;"
| style="text-align:center;"| G
| style="text-align:left;"| [[w:Ford Motor Company - Columbus Assembly Plant|Columbus Branch Assembly Plant]]<ref>[http://digital-collections.columbuslibrary.org/cdm/compoundobject/collection/ohio/id/12969/rec/1 "Ford Motor Company – Columbus Plant (Photo and History)"], Columbus Metropolitan Library Digital Collections</ref>
| style="text-align:left;"| [[w:Columbus, Ohio|Columbus, OH]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 – 1932
| style="text-align:left;"| 427 Cleveland Avenue
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Assembly ended March 1932. Factory closed 1939. Was the Kroger Co. Columbus Bakery until February 2019.
|- style="vertical-align:top;"
| style="text-align:center;"| JE (JK)
| style="text-align:left;"| [[w:Commodore Point|Commodore Point Assembly Plant]]
| style="text-align:left;"| [[w:Jacksonville, Florida|Jacksonville, Florida]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Produced from 1924 to 1932. Closed (1968)
| style="text-align:left;"| 1900 Wambolt Street. At the Foot of Wambolt St. on the St. John's River next to the Mathews Bridge.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]] cars and trucks, [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| 1924–1932, production years. Parts warehouse until 1968. Planned to be demolished in 2023.
|- style="vertical-align:top;"
| style="text-align:center;"| DS/DL
| style="text-align:left;"| Dallas Branch Assembly Plant
| style="text-align:left;"| [[w:Dallas|Dallas, TX]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1925
| style="text-align:left;"| 2700 Canton St then moved in 1925 to 5200 E. Grand Ave. near Fair Park
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Replaced by plant on 5200 E. Grand Ave. in 1925. Ford continued to use 2700 Canton St. for display and storage until 1939. In 1942, sold to Peaslee-Gaulbert Corporation, which had already been using the building since 1939. Sold to Adam Hats in 1959. Redeveloped in 1997 into Adam Hats Lofts, a loft-style apartment complex.
|- style="vertical-align:top;"
| style="text-align:center;"| T
| style="text-align:left;"| Danforth Avenue Assembly
| style="text-align:left;"| [[w:Toronto|Toronto]], [[w:Ontario|Ontario]]
| style="text-align:left;"| [[w:Canada|Canada]]
| style="background:Khaki;{{Text default color}}; text-align:center;"| Sold (1946)
| style="text-align:left;"| 2951-2991 Danforth Ave.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]<br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br /> and other cars
| style="text-align:left;"| Replaced by [[w:Oakville Assembly|Oakville Assembly]]. Sold to [[w:Nash Motors|Nash Motors]] in 1946 which then merged with [[w:Hudson Motor Car Company|Hudson Motor Car Company]] to form [[w:American Motors Corporation|American Motors Corporation]], which then used the plant until it was closed in 1957. Converted to a mall in 1962, Shoppers World Danforth. The main building of the mall (now a Lowe's) is still the original structure of the factory.
|- style="vertical-align:top;"
| style="text-align:center;"| DR
| style="text-align:left;"| Denver Branch Assembly Plant
| style="text-align:left;"| [[w:Denver|Denver, CO]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1933
| style="text-align:left;"| 900 South Broadway
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model TT|Ford Model TT]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Sold to Gates Rubber Co. in 1945. Gates sold the building in 1995. Now used as office space. Partly used as a data center by Hosting.com, now known as Ntirety, from 2009.
|- style="vertical-align:top;"
| style="text-align:center;"| DM
| style="text-align:left;"| Des Moines Assembly Plant
| style="text-align:left;"| [[w:Des Moines, IA|Des Moines, IA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from April 1920–December 1932
| style="text-align:left;"| 1800 Grand Avenue
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Sold in 1943. Renovated in the 1980s into Des Moines School District's technical high school and central campus.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Dothan Branch Assembly Plant
| style="text-align:left;"| [[w:Dothan, AL|Dothan, AL]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| 1923–1927?
| style="text-align:left;"| 193 South Saint Andrews Street and corner of E. Crawford Street
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Later became an auto dealership called Malone Motor Company and was St. Andrews Market, an indoor market and event space, from 2013-2015 until a partial roof collapse during a severe storm. Since 2020, being redeveloped into an apartment complex. The curved assembly line anchored into the ceiling is still intact and is being left there. Sometimes called the Ford Malone Building.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Dupont St Branch Assembly Plant
| style="text-align:left;"| [[w:Toronto|Toronto, ON]]
| style="text-align:left;"| Canada
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1915 to 1925
| style="text-align:left;"| 672 Dupont St
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Production moved to Danforth Assembly Plant. Building roof was used as a test track for the Model T. Used by several food processing companies. Became Planters Peanuts Canada from 1948 till 1987. The building currently is used for commercial and retail space. Included on the Inventory of Heritage Properties.
|- style="vertical-align:top;"
| style="text-align:center;"| E/EG/E
| style="text-align:left;"| [[w:Edgewater Assembly|Edgewater Assembly]]
| style="text-align:left;"| [[w:Edgewater, New Jersey|Edgewater, New Jersey]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}};text-align:center;"| Operated from 1930 to 1955
| style="text-align:left;"| 309 River Road
| style="text-align:left;"| [[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:Ford Model 48|Ford Model 48]]<br />[[w:1937 Ford|1937 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />[[w:Ford GPW|Ford GPW]] (Jan.-Apr. 1943 only: 1,333 units)<br />[[w:1949 Ford|1949 Ford]]<br />[[w:1952 Ford|1952 Ford]]<br />[[w:1955 Ford|1955 Ford]]<br />[[w:Ford F-Series|Ford F-Series]] (1951-1954)
| style="text-align:left;"| Replaced with the Mahwah Assembly Plant. Added to the National Register of Historic Places on September 15, 1983. The building was torn down in 2006 and replaced with a residential development called Independence Harbor.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Fargo Branch Assembly Plant
| style="text-align:left;"| [[w:Fargo, North Dakota|Fargo, ND]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1915 to 1917
| style="text-align:left;"| 505 N. Broadway
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| After assembly ended, Ford used it as a sales office, sales and service branch, and a parts depot. Ford sold the building in 1956. Now called the Ford Building, a mixed commercial/residential property.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Fort Worth Assembly Plant
| style="text-align:left;"| [[w:Fort Worth, TX|Fort Worth, TX]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated for about 6 months around 1916
| style="text-align:left;"|
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Briefly supplemented Dallas plant but production was then reconsolidated into the Dallas plant and Fort Worth plant was closed.
|- style="vertical-align:top;"
| style="text-align:center;"| H
| style="text-align:left;"| Houston Branch Assembly Plant
| style="text-align:left;"| [[w:Houston|Houston, TX]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1932
| style="text-align:left;"| 3906 Harrisburg Boulevard
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], aircraft parts during WWII
| style="text-align:left;"| Divested during World War II; later acquired by General Foods in 1946 (later the Houston facility for [[w:Maxwell House|Maxwell House]]) until 2006 when the plant was sold to Maximus and rebranded as the Atlantic Coffee Solutions facility. Atlantic Coffee Solutions shut down the plant in 2018 when they went out of business. Leased by Elemental Processing in 2019 for hemp processing with plans to begin operations in 2020.
|- style="vertical-align:top;"
| style="text-align:center;"| I
| style="text-align:left;"| Indianapolis Branch Assembly Plant
| style="text-align:left;"| [[w:Indianapolis|Indianapolis, IN]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"|1914–1932
| style="text-align:left;"| 1315 East Washington Street
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Vehicle production ended in December 1932. Used as a Ford parts service and automotive sales branch and for administrative purposes until 1942. Sold in 1942.
|- style="vertical-align:top;"
| style="text-align:center;"| KC/K
| style="text-align:left;"| Kansas City Branch Assembly
| style="text-align:left;"| [[w:Kansas City, Missouri|Kansas City, Missouri]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| 1912–1956
| style="text-align:left;"| Original location from 1912 to 1956 at 1025 Winchester Avenue & corner of E. 12th Street
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]],<br> [[w:Ford Model A (1927–1931)|Ford Model A]],<br> [[w:1932 Ford|1932 Ford]], <br>[[w:Ford Model 48|Ford Model 48]],<br> [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]], [[w:1957 Ford|1957 Ford]], [[w:Ford F-Series|Ford F-Series]] (1951-1956), [[w:Ford F-Series (medium-duty truck)#Second generation (1953–1956)|Ford F-Series (medium-duty truck)]] (1956)
| style="text-align:left;"| First Ford factory in the USA built outside the Detroit area. Location of first UAW strike against Ford and where the 20 millionth Ford vehicle was assembled. Last vehicle produced was a 1957 Ford Fairlane Custom 300 on December 28, 1956. 2,337,863 vehicles were produced at the Winchester Ave. plant. Replaced by [[w:Ford Kansas City Assembly Plant|Claycomo]] plant in 1957.
|- style="vertical-align:top;"
| style="text-align:center;"| KY
| style="text-align:left;"| Kearny Assembly
| style="text-align:left;"| [[w:Kearny, New Jersey|Kearny, New Jersey]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1918 to 1930
| style="text-align:left;"| 135 Central Ave., corner of Ford Lane
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]]
| style="text-align:left;"| Replaced by the Edgewater Assembly Plant.
|- style="vertical-align:top;"
|
| style="text-align:left;"| Long Island City Branch Assembly Plant
| style="text-align:left;"| [[w:Long Island City|Long Island City]], [[w:Queens|Queens, NY]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1912 to 1917
| style="text-align:left;"| 564 Jackson Ave. (now known as <br> 33-00 Northern Boulevard) and corner of Honeywell St.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| Opened as Ford Assembly and Service Center of Long Island City. Building was later significantly expanded around 1914. The original part of the building is along Honeywell St. and around onto Northern Blvd. for the first 3 banks of windows. Replaced by the Kearny Assembly Plant in NJ. Plant taken over by U.S. Government. Later occupied by Goodyear Tire (which bought the plant in 1920), Durant Motors (which bought the plant in 1921 and produced Durant-, Star-, and Flint-brand cars there), Roto-Broil, and E.R. Squibb & Son. Now called The Center Building and used as office space.
|- style="vertical-align:top;"
| style="text-align:center;"|LA
| style="text-align:left;"| Los Angeles Branch Assembly Plant
| style="text-align:left;"| [[w:Los Angeles|Los Angeles, CA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1930
| style="text-align:left;"| 12th and Olive Streets, then E. 7th St. and Santa Fe Ave. (2060 East 7th St. or 777 S. Santa Fe Avenue).
| style="text-align:left;"| Original Los Angeles plant: [[w:Ford Model T|Ford Model T]]. <br /> Second Los Angeles plant (1914-1930): [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]].
| style="text-align:left;"| Location on 7th & Santa Fe is now the headquarters of Warner Music Group.
|- style="vertical-align:top;"
| style="text-align:center;"| LE/LU/U
| style="text-align:left;"| [[w:Louisville Assembly Plant|Louisville Branch Assembly Plant]]
| style="text-align:left;"| [[w:Louisville, Kentucky|Louisville, Kentucky]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| 1913–1916, 1916–1925, 1925–1955, 1955–present
| style="text-align:left;"| 931 South Third Street then <br /> 2400 South Third Street then <br /> 1400 Southwestern Parkway then <br /> 2000 Fern Valley Rd.
| style="text-align:left;"|
|style="text-align:left;"| Original location opened in 1913. Ford then moved in 1916 and again in 1925. First 2 plants made the [[w:Ford Model T|Ford Model T]]. The third plant made the [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:Ford F-Series|Ford F-Series]] (1951-1954) as well as Jeeps ([[w:Ford GPW|Ford GPW]] - 93,364 units), military trucks, and V8 engines during World War II. Current location at 2000 Fern Valley Rd. first opened in 1955.<br /> The 2400 South Third Street location (at the corner of Eastern Parkway) was sold to Reynolds Metals Company and has since been converted into residential space called Reynolds Lofts under lease from current owner, University of Louisville.
|- style="vertical-align:top;"
| style="text-align:center;"| MEM/MP/M
| style="text-align:left;"| Memphis Branch Assembly Plant
| style="text-align:left;"| [[w:Memphis, Tennessee|Memphis, TN]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1913-June 1958
| style="text-align:left;"| 495 Union Ave. (1913–1924) then 1429 Riverside Blvd. and South Parkway West (1924–1933, 1935–1958)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]], [[w:1957 Ford|1957 Ford]], [[w:Ford F-Series|Ford F-Series]] (1951-1952, 1954-1956)
| style="text-align:left;"| Both plants have been demolished.
|- style="vertical-align:top;"
| style="text-align:center;"|
| style="text-align:left;"| Milwaukee Branch Assembly Plant
| style="text-align:left;"| [[w:Milwaukee|Milwaukee, WI]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1916 to 1932
| style="text-align:left;"| 2185 N. Prospect Ave.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Building is still standing as a mixed use development.
|- style="vertical-align:top;"
| style="text-align:center;"| TC/SP
| style="text-align:left;"| Minneapolis Branch Assembly Plant
| style="text-align:left;"| [[w:Minneapolis|Minneapolis, MN]] and [[w:Saint Paul, Minnesota|St. Paul]], MN
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1912 to 2011
| style="text-align:left;"| 616 S. Third St in Minneapolis (1912-1914) then 420 N. Fifth St. in Minneapolis (1914-1925) and 117 University Ave. West in St. Paul (1914-1920)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]]
| style="text-align:left;"| 420 N. Fifth St. is now called Ford Center, an office building. Was the tallest automotive assembly plant at 10 stories.<br /> University Ave. plant in St. Paul is now called the Ford Building. After production ended, was used as a Ford sales and service center, an auto mechanics school, a warehouse, and Federal government offices. Bought by the State of Minnesota in 1952 and used by the state government until 2004.
|- style="vertical-align:top;"
| style="text-align:center;"| M
| style="text-align:left;"| Montreal Assembly Plant
| style="text-align:left;"| [[w:Montreal|Montreal, QC]]
| style="text-align:left;"| Canada
| style="background:LightSalmon;{{Text default color}}; text-align:center;"|
| style="text-align:left;"| 119-139 Laurier Avenue East
| style="text-align:left;"|
| style="text-align:left;"|
|- style="vertical-align:top;"
| style="text-align:center;"| NO
| style="text-align:left;"| New Orleans
| style="text-align:left;"| [[w:Arabi, Louisiana|Arabi, Louisiana]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1923–December 1932
| style="text-align:left;"| 7200 North Peters Street, Arabi, St. Bernard Parish, Louisiana
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model TT|Ford Model TT]], [[w:Ford Model A (1927–1931)|Ford Model A]]
| style="text-align:left;"| Later used by Ford as a parts and vehicle dist. center. Used by the US Army as a warehouse during WWII. After the war, was used as a parts and vehicle dist. center by a Ford dealer, Capital City Ford of Baton Rouge. Used by Southern Service Co. to prepare Toyotas and Mazdas prior to their delivery into Midwestern markets from 1971 to 1977. Became a freight storage facility for items like coffee, twine, rubber, hardwood, burlap and cotton from 1977 to 2005. Flooded during Hurricane Katrina. Listed on the National Register of Historic Places in 2018.
|- style="vertical-align:top;"
| style="text-align:center;"| OC
| style="text-align:left;"| [[w:Oklahoma City Ford Motor Company Assembly Plant|Oklahoma City Branch Assembly Plant]]
| style="text-align:left;"| [[w:Oklahoma City|Oklahoma City, OK]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1916 to 1932
| style="text-align:left;"| 900 West Main St.
| style="text-align:left;"|[[w:Ford Model T|Ford Model T]]<br /> [[w:Ford Model A (1927–1931)|Ford Model A]]<br /> [[w:1932 Ford|1932 Ford]]
|Had extensive access to rail via the Rock Island railroad. Production ended with the 1932 models. The plant was converted to a Ford Regional Parts Depot (1 of 3 designated “slow-moving parts branches") and remained so until 1967, when the plant closed, and was then sold in 1968 to The Fred Jones Companies, an authorized re-manufacturer of Ford and later on, also GM Parts. It remained the headquarters for operations of Fred Jones Enterprises (a subsidiary of The Fred Jones Companies) until Hall Capital, the parent of The Fred Jones Companies, entered into a partnership with 21c Hotels to open a location in the building. The 21c Museum Hotel officially opened its hotel, restaurant and art museum in June, 2016 following an extensive remodel of the property. Listed on the National Register of Historic Places in 2014.
|- style="vertical-align:top;"
|
| style="text-align:left;"| [[w:Omaha Ford Motor Company Assembly Plant|Omaha Ford Motor Company Assembly Plant]]
| style="text-align:left;"| [[w:Omaha, Nebraska|Omaha, NE]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1916 to 1932
| style="text-align:left;"| 1502-24 Cuming St.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Used as a warehouse by Western Electric Company from 1956 to 1959. It was then vacant until 1963, when it was used for manufacturing hair accessories and other plastic goods by Tip Top Plastic Products from 1963 to 1986. After being vacant again for several years, it was then used by Good and More Enterprises, a tire warehouse and retail outlet. After another period of vacancy, it was redeveloped into Tip Top Apartments, a mixed-use building with office space on the first floor and loft-style apartments on the upper levels which opened in 2005. Listed on the National Register of Historic Places in 2004.
|- style="vertical-align:top;"
| style="text-align:center;"|CR/CS/C
| style="text-align:left;"| Philadelphia Branch Assembly Plant ([[w:Chester Assembly|Chester Assembly]])
| style="text-align:left;"| [[w:Philadelphia|Philadelphia, PA]]<br>[[w:Chester, Pennsylvania|Chester, Pennsylvania]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1961
| style="text-align:left;"| Philadelphia: 2700 N. Broad St., corner of W. Lehigh Ave. (November 1914-June 1927) then in Chester: Front Street from Fulton to Pennell streets along the Delaware River (800 W. Front St.) (March 1928-February 1961)
| style="text-align:left;"| [[w:Ford Model A (1927–1931)|Ford Model A]],<br> [[w:1932 Ford|1932 Ford]],<br> [[w:Ford Model 48|Ford Model 48]],<br> [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:Ford GPW|Ford GPW]] (18,533 units), [[w:1949 Ford|1949 Ford]],<br> [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]], [[w:1957 Ford|1957 Ford]], [[w:Ford Galaxie|Ford Galaxie]] (1959-1961), [[w:Ford F-Series (first generation)|Ford F-Series (first generation)]] (1951-1952),<br> [[w:Ford F-Series (second generation)|Ford F-Series (second generation)]] (1953-1955),<br> [[w:Ford F-Series (third generation)|Ford F-Series (third generation)]]
| style="text-align:left;"| November 1914-June 1927 in Philadelphia then March 1928-February 1961 in Chester. Broad St. plant made equipment for US Army in WWI including helmets and machine gun trucks. Sold in 1927. Later used as a [[w:Sears|Sears]] warehouse and then to manufacture men's clothing by Joseph H. Cohen & Sons, which later took over [[w:Botany 500|Botany 500]], whose suits were then also made at Broad St., giving rise to the nickname, Botany 500 Building. Cohen & Sons sold the building in 1989 which seems to be empty now. Chester plant also handled exporting to overseas plants.
|- style="vertical-align:top;"
| style="text-align:center;"| P
| style="text-align:left;"| [[w:Ford Motor Company Assembly Plant (Pittsburgh, Pennsylvania)|Pittsburgh Branch Assembly Plant]]
| style="text-align:left;"| [[w:Pittsburgh|Pittsburgh, PA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1915 to 1932
| style="text-align:left;"| 5000 Baum Blvd and Morewood Ave.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Became a Ford sales, parts, and service branch until Ford sold the building in 1953. The building then went through a variety of light industrial uses before being purchased by the University of Pittsburgh Medical Center (UPMC) in 2006. It was subsequently purchased by the University of Pittsburgh in 2018 to house the UPMC Immune Transplant and Therapy Center, a collaboration between the university and UPMC. Listed on the National Register of Historic Places in 2018.
|- style="vertical-align:top;"
| style="text-align:center;"| PO
| style="text-align:left;"| Portland Branch Assembly Plant
| style="text-align:left;"| [[w:Portland, Oregon|Portland, OR]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated 1914–1917, 1923–1932
| style="text-align:left;"| 2505 SE 11th Avenue
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Called the Ford Building and is occupied by various businesses. .
|- style="vertical-align:top;"
| style="text-align:center;"| RH/R (Richmond)
| style="text-align:left;"| [[w:Ford Richmond Plant|Richmond Plant]]
| style="text-align:left;"| [[w:Richmond, California|Richmond, California]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| 1931-1955
| style="text-align:left;"| 1414 Harbour Way S
| style="text-align:left;"| [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], [[w:Ford GPW|Ford GPW]] (49,359 units), [[w:Ford F-Series|Ford F-Series]] (1951-1954), [[w:1949 Ford|1949 Ford]], [[w:1952 Ford|1952 Ford]], [[w:1955 Ford|1955 Ford]].
| style="text-align:left;"| Richmond was one of the first 2 Ford plants to build the F-Series, beginning November 27, 1947 (other was Highland Park, Michigan). Richmond location is now part of Rosie the Riveter National Historical Park. Replaced by San Jose Assembly Plant in Milpitas.
|- style="vertical-align:top;"
| style="text-align:center;"|SFA/SFAA (San Francisco)
| style="text-align:left;"| San Francisco Branch Assembly Plant
| style="text-align:left;"| [[w:San Francisco|San Francisco, CA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| 1914-1931
| style="text-align:left;"| 2905 21st Street and Harrison St.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]]
| style="text-align:left;"| Replaced by the Richmond Assembly Plant. San Francisco Plant was demolished after the 1989 earthquake.
|- style="vertical-align:top;"
| style="text-align:center;"| SR/S
| style="text-align:left;"| [[w:Somerville Assembly|Somerville Assembly]]
| style="text-align:left;"| [[w:Somerville, Massachusetts|Somerville, Massachusetts]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1926 to 1958
| style="text-align:left;"| 183 Middlesex Ave.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]] <br />[[w:Ford Model A (1927–1931)|Ford Model A]]<br />[[w:1932 Ford|1932 Ford]]<br />[[w:1941 Ford|1941 Ford]]<br />[[w:1949 Ford|1949 Ford]]<br />[[w:1952 Ford|1952 Ford]]<br />[[w:1955 Ford|1955 Ford]]<br />[[w:1957 Ford|1957 Ford]]<br />[[w:Ford F-Series|Ford F-Series]] (1951-1953)<br />Built [[w:Edsel Corsair|Edsel Corsair]] (1958) & [[w:Edsel Citation|Edsel Citation]] (1958) July-October 1957, Built [[w:1957 Ford|1958 Fords]] November 1957 - March 1958.
| style="text-align:left;"| The only [[w:Edsel|Edsel]]-only assembly line. Operations moved to Lorain, OH. Converted to [[w:Assembly Square Mall|Assembly Square Mall]] in 1980
|- style="vertical-align:top;"
| style="text-align:center;"| AS
| style="text-align:left;"| [http://pcad.lib.washington.edu/building/4902/ Seattle Branch Assembly Plant #1]
| style="text-align:left;"| [[w:South Lake Union, Seattle|South Lake Union, Seattle, WA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1914 to 1932
| style="text-align:left;"| 1155 Valley Street & corner of 700 Fairview Ave. N.
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Now a Public Storage site.
|- style="vertical-align:top;"
| style="text-align:center;"| AS
| style="text-align:left;"| [[w:Ford Motor Company Assembly Plant (Seattle)|Seattle Branch Assembly Plant #2]]
| style="text-align:left;"| [[w:Georgetown, Seattle|Georgetown, Seattle, WA]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from May 1932–December 1932
| style="text-align:left;"| 4730 East Marginal Way
| style="text-align:left;"| [[w:1932 Ford|1932 Ford]]
| style="text-align:left;"| Still a Ford sales and service site through 1941. As early as 1940, the U.S. Army occupied a portion of the facility which had become known as the "Seattle General Depot". Sold to US Government in 1942 for WWII-related use. Used as a staging site for supplies headed for the Pacific Front. The U.S. Army continued to occupy the facility until 1956. In 1956, the U.S. Air Force acquired control of the property and leased the facility to the Boeing Company. A year later, in 1957, the Boeing Company purchased the property. Known as the Boeing Airplane Company Missile Production Center, the facility provided support functions for several aerospace and defense related development programs, including the organizational and management facilities for the Minuteman-1 missile program, deployed in 1960, and the Minuteman-II missile program, deployed in 1969. These nuclear missile systems, featuring solid rocket boosters (providing faster lift-offs) and the first digital flight computer, were developed in response to the Cold War between the U.S. and the Soviet Union in the 1960s and 1970s. The Boeing Aerospace Group also used the former Ford plant for several other development and manufacturing uses, such as developing aspects of the Lunar Orbiter Program, producing unstaffed spacecraft to photograph the moon in 1966–1967, the BOMARC defensive missile system, and hydrofoil boats. After 1970, Boeing phased out its operations at the former Ford plant, moving them to the Boeing Space Center in the city of Kent and the company's other Seattle plant complex. Owned by the General Services Administration since 1973, it's known as the "Federal Center South Complex", housing various government offices. Listed on the National Register of Historic Places in 2013.
|- style="vertical-align:top;"
| style="text-align:center;"|STL/SL
| style="text-align:left;"| St. Louis Branch Assembly Plant
| style="text-align:left;"| [[w:St. Louis|St. Louis, MO]]
| style="text-align:left;"| U.S.
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| 1914-1942
| style="text-align:left;"| 4100 Forest Park Ave.
| style="text-align:left;"|
| style="text-align:left;"|
|- style="vertical-align:top;"
| style="text-align:center;"| V
| style="text-align:left;"| Vancouver Assembly Plant
| style="text-align:left;"| [[w:Vancouver|Vancouver, BC]]
| style="text-align:left;"| Canada
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1920 to 1938
| style="text-align:left;"| 1188 Hamilton St
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]]
| style="text-align:left;"| Production moved to Burnaby plant in 1938. Still standing; used as commercial space.
|- style="vertical-align:top;"
| style="text-align:center;"| W
| style="text-align:left;"| Winnipeg Assembly Plant
| style="text-align:left;"| [[w:Winnipeg|Winnipeg, MB]]
| style="text-align:left;"| Canada
| style="background:LightSalmon;{{Text default color}}; text-align:center;"| Operated from 1915 to 1941
| style="text-align:left;"| 1181 Portage Avenue (corner of Wall St.)
| style="text-align:left;"| [[w:Ford Model T|Ford Model T]], [[w:Ford Model A (1927–1931)|Ford Model A]], [[w:1932 Ford|1932 Ford]], [[w:Ford Model 48|Ford Model 48]], [[w:1937 Ford|1937 Ford]], [[w:1941 Ford|1941 Ford]], military trucks
| style="text-align:left;"| Bought by Manitoba provincial government in 1942. Became Manitoba Technical Institute. Now known as the Robert Fletcher Building
|- style="vertical-align:top;"
|}
h2rj5czp6sh06suswakfno9wchlyc5l
Choctaw
0
478041
4669593
4669485
2026-09-10T12:56:31Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edits by [[Special:Contributions/~2026-49226-92|~2026-49226-92]] ([[User talk:~2026-49226-92|talk]]) to last version by Linguanaut
4537405
wikitext
text/x-wiki
{{New book}}
==Choctaw ==
{{shelves|Languages_of_North_America}}
{{alphabetical|C}}
{{status|0%}}
{{reading level|intermediate}}
This book teaches basic Choctaw through short bilingual texts. Grammar is introduced gradually and as needed.
==Table of contents==
# [[/Introduction|Introduction]]
# [[/Lesson_001|Lesson 1]]
# [[/Lesson_002|Lesson 2]]
qxnchax4lm4w5b38n7g3rsnbzhaknzi
General Literary Chinese from Scratch/Introduction
0
481712
4669614
4656086
2026-09-10T16:49:58Z
Shira the Mogul
3560559
4669614
wikitext
text/x-wiki
== About this Book ==
This book is not the same as [[Classical Chinese]], which is aimed at teaching the language spoken by Confucius and Zhuang Zhou during the peak of the classical period. This book teaches how that language was used by individuals across multiple countries. It makes no assumptions about your knowledge: You can be a person like me - a westerner who simply loves the language - or anyone else. I will also not assume you have linguistic knowledge; I will avoid using it where I can, but direct you to the linguistic term if you wish to use it. This book respects your intelligence.
The book is organised into ''Units'' as if this were a course, using principles taken from [[wikipedia:Teaching English as a Foreign Language|Teaching English as a Foreign Language]]. We will go through several stages of comprehension; from simply understanding the Han script as an entity, to general-purpose comprehension. Skimming, scanning, and extensive reading skills will be trained. You will not be completely fluent in reading this language solely from this text, but it will serve as a guiding hand. I will provide texts for you to optionally read alongside this book from Wikisource.
The reason this book is being made is that the standard Literary Chinese curriculum is extremely impoverished. Most materials focus heavily on Zhou-Qin texts and, due to the small corpus, get railroaded into forcing students to learn lengthy, difficult passages right from the get-go. Numerous textbooks, both English and Chinese, are like this. It does not have to be this way and these faulty curricula usually come from either a lack of materials management, a need to adhere to a broader philosophy curriculum, or both. This book hopes to rectify this wrong by drawing upon the entire Sinosphere for resources instead, whilst still preserving the classics and the good parts of the methodology used in contemporary textbooks. In doing so, the book hopes to give you a broader historical understanding of the Literary Chinese tradition and how it was adopted into these different cultures, which is essential for the context this language requires to be readily understood.
Drawing upon contemporary TEFL considerations for literature, I introduce a "buffet" approach with the gathered materials: In other words, I raise many "mini-units" that draw upon literature from broad themes. These aim to showcase culture and genre, two major "nodes" of Literary Chinese discourse. Difficulty will increase according to theme, but they will all follow a similar path of shorter excerpts first, to lengthy texts at the end. The broader syllabus is centralised around scaffolded vocabulary: Each text will naturally lead into the next, and you will be expected to remember vocabulary from each unit. This does come with some changes to how Literary Chinese is taught, though: For example, Zhuangzi is often taught early due to his unbelievable influence on Sinitic thought. However, his texts are incredibly dense and use poetry, which naturally requires the concepts of argumentation and poetry being showcased first. This scaffolded approach hopes to make it so that Zhuangzi and other philosophers can be read comfortably through pacing the learning curve, allowing him and similar major figures to be understood with full appreciation.
We will be using [[wikipedia:Traditional Chinese|Traditional Chinese]] in this book. However, there are regional variants within this, and content from the [[wikipedia:People's Republic of China|People's Republic of China]] may insist on [[wikipedia:Simplified Chinese|Simplified Chinese]], which was a reform in the 1940s that standardised common handwritten variants. This book has no horse in the race of which standardised system is best: Use what you want, and what is best, for your writing.
Therefore, lessons will be structured like so:
* Lead-In: Small nuggets of knowledge that will set the context.
* Pre-Reading: An explanation of patterns and characters that will be important for reading.
* Text: What we are hoping to read
* Gloss: Glosses to relevant vocabulary.
* Explanation: An explanation of the characters and patterns within.
* Exercises: Questions to answer for yourself.
* Similar texts
For example...<blockquote>一武曰木
One thing (is) called a tree
(explanation...)</blockquote>And glorious etcetera!
It should be noted that a translation will never be outright given to you. The expectation is that you come out of these lessons with the ability to interpret a text for yourself. There are translation tools online, and these are acceptable, but the opportunity for that first interpretation must exist for your personal development.
== On Phonology ==
Literary Chinese itself has no phonology. Therefore, rather than prescribe you a new phonology to learn, '''I will be giving you the [[wikipedia:Cangjie input method|Cangjie Input Method]] combinations, which targets the structure of the characters instead.'''
However, this is not to say the language was not spoken: It was, and is, recited, especially in poetry. Therefore, should you be interested in recitals and the like (and they ''are'' wonderful!), I strongly recommend you use a tool to view the phoneticization for what we can call your '''reading language'''. I personally recommend Yomitan for this, which allows you to press Shift to view it instantly.
This text will present poetry in the modern phonology of the country a text is from. If it is Japanese poetry, it will be in Sino-Japanese. If it is in Chinese, it will be in Mandarin Chinese and
Cantonese.<!--- Mandarin is accessible to the majority of Chinese individuals whilst Cantonese is popular, accessible, and preserves a lot of tone and final distinctions. I can't just dig my head in the sand and ignore either, so let's use both. ---> So on, so forth.
== What is Literary Chinese? ==
Literary Chinese is the "scripta franca" used across East Asia until around the 20th Century. It is still sporadically used today in traditional Chinese and Japanese poetry, Taiwanese law, and classically-inclined literature, but enjoyed broad usage prior to 1917, when the [[wikipedia:New Culture Movement|New Culture Movement]] led by [[wikipedia:Hu Shi|Hu Shi]] 胡適 finally put an end to it. The [[wikipedia:CJK characters|CJKVZ]] family of characters shows that the Han script was used in a wide variety of environments. It is not just China and Japan! It has been used in Korea, Vietnam, the [[wikipedia:Ryukyu Kingdom|Ryukyu Kingdom]], Singapore, and even Malaysia! By accessing this language, you can read historical literature from any of these countries. It is not simply a pan-Asian language, though: It is also diachronic, having vocabulary loaned and forgotten over the years. It is something of a moving target: Texts written in 5th Century Japan will be very similar to those written in 10th Century Vietnam, though each nation may write a given character differently, but the underlying syntax will be identical.
Literary Chinese is filled with boundless genres, such as...
* Confucianism
* Daoism
* Buddhism
* Poetry
* Law
* Politics
* Government
* Philosophy
* Traditional Chinese Medicine (TCM)
* History
* Military affairs
* Tea culture
* Ethics and morals
* Education theory
* Travel logs
* Christianity
* Lexicography (creation of dictionaries)
* Encyclopaediae
* Art history
* Literary criticism & commentary
* Academia
And so, so, so much more! It is the language used by the literati of yesteryear for thousands of years. The tradition is a leviathan that is hard to fully grasp and appreciate even as one grows in experience. One could say you grow with this language.
I will make something clear: Literary Chinese is by no means a strict Han institution. It is a massively diverse language that has been used by people of many ethnicities, and these people will all be given voices in this book. Each of these people had different cultures, values, and motivations for using this language. Jurchens and their Manchu successors used the language to claim Han lineage; Tangut peoples used it to differentiate themselves from Han Chinese; Japanese people used it to supplement their at-the-time unwritten tongue. These motivations all present unique challenges: Noticing these occurrences is essential. However, it is not sunshine and rainbows: Manchuria used Literary Chinese for law and edicts to assist in Japanese colonisation of northern China, and the Mongols used it when committing genocide against the Western Xia. It is a language of power, and some would use it to speak to that power: Consort Dasese used the language against the Khitan Emperor Taizuo of Liao when his complacence led to his downfall. This textbook hopes to synthesise and marry these concepts, to show Literary Chinese as it actually functioned.
==What this book is not==
This book is a modern take on how to read and write Literary Chinese. Therefore, this book is ''not'':
* '''An introduction to Chinese linguistics:''' Chinese linguistics (or as I like to call it, sinolinguistics) is a complex and wholly separate topic to Literary Chinese. You do not need to be a linguist to write or read Literary Chinese, lord knows readers over the past 1,200 years were not.
* '''A reconstruction of Old Chinese:''' Old Chinese is useful to inform one's understanding of the classics, and will be cited occasionally, but it is not important for reading Literary Chinese.
* '''A book on historical linguistics:''' Historical linguistics, again, is useful, and will be cited, but you will not come away with a broad understanding of this topic.
* '''A palaeography book:''' Character variants and historical forms of Han characters may be used, but I will not be teaching you how to conduct paleography. They are reference points to help you understand where characters came from and why they look the way they do.
There are numerous resources on these topics, particularly by scholars like Ferdinand de Saussure, Edwin G. Pulleyblank, and William H. Baxter. Therefore, anything I say on these topics should be taken as vehicles and lenses for learning the language, not as something super academic. Language and linguistics are separate topics.
==Conclusion==
By the end of this book, I will ensure you can read anything from a deeply personal account of a Daimyo's life when Japan was in its infancy, all the way to World War I as it happened in the eyes of someone from Vietnam. You will be able to get trapped in this sprawling labyrinth and slowly improve at whatever specialisation you're looking for.
Sound awesome? Then let's dive in!
{{BookCat}}
5ede0jb8skokirwb5r9djg5rchvz19q
FlightGear Flight Simulator
0
483312
4669594
4669492
2026-09-10T12:56:39Z
MathXplore
3097823
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-49226-92|~2026-49226-92]] ([[User talk:~2026-49226-92|talk]]) to last version by Fcbs3
4635791
wikitext
text/x-wiki
This is an introduction to [[wikipedia:FlightGear|FlightGear]] 2024.1, from installation to advanced topics.
== Table of Contents ==
* [[/Installation|Installation]]
* [[/Getting Started|Getting Started with FlightGear]]
* [[/Advanced/|Advanced]]
** [[/Advanced/Fly Boeing 777|Fly Boeing 777]]
** [[/Advanced/Fly Airbus A320|Fly Airbus A320]]
** [[/Advanced/Intro to fighter aircrafts|Intro to fighter aircrafts]]
** [[/Advanced/Helicopters|Helicopters]]
** [[/Advanced/Multiplayer|Multiplayer]]
* [[/Technical/|Technical]]
** [[/Technical/Command line options|Command line options]]
** [[/Technical/Property tree|Property tree]]
* [[/Contributing|Contributing]]
* [[/Appendices/]]
** [[/Glossary/]]
** [[/Keyboard Quick Reference/]]
{{Shelves|Electronic games|Aircraft}}
{{status|25%}}
dorgtji6s3vp54fnstp1xjtm99k6p0a
Typewriting
0
484043
4669568
4669495
2026-09-10T12:48:38Z
Codename Noreste
3441010
[[WB:REVERT|Reverted]] edit by [[Special:Contributions/~2026-48940-54|~2026-48940-54]] ([[User talk:~2026-48940-54|talk]]) to last version by Kai Burghardt
4655735
wikitext
text/x-wiki
{{displaytitle|title=𝚃𝚢𝚙𝚎𝚠𝚛𝚒𝚝𝚒𝚗𝚐}}
Typewriters are machines that can be used to print texts on paper.
Today, typewriters are obsolete technology;
they are uneconomic and have been superseded by electronic devices.
== about ==
{{IPA notice}}<!-- transcription of word platen -->
{{reading level|intermediate}}
In the heyday of typewriters hundreds of books were written on typewriting.
Unfortunately, when typewriters fell out of favor many people simply threw them away.
It may be difficult to find and get a copy.
This collaboratively edited Wikibook attempts to address the demand.
Typewriter enthusiasts around the world have created and shared thousands upon thousands of instructional videos.
We are glad you are considering reading an easily searchable textbook instead or to supplement video instructions.
; learning objective
: skillful use of non‐specialized <!-- stenographic typewriters used by court reporters, Braille typewriters used by blind people --> non‐ancient <!-- not first generation --> typewriters designed to type up general documents in English
; target audience
: seeing and hearing adults
; not covered in this Wikibook
: This book is {{em|not}} <!-- the {{em}} template is used so a text search for a straight/typewriter apostrophe yields more relevant results --> about [[How to Type|touchtyping]], the skill of typing without looking at the keys (sometimes by layman also called {{em|typewriting}}), because it is a largely transferable skill (cmp. [[#legacy|§ legacy]]). This book does not provide product guidance, choosing the right typewriter that suits your needs. Only very mundane “artistic” use is described, not like “ASCII art” or similar.
; structure
: top‐down: general instructions, then delve into details; <!-- in the spirit of Wikibooks ain’t paper --> a lot of information is repeated multiple times so you may refer to sections in a handbook manner; {{em|strictly}} continuous reading from stem to stern should not be necessary
; guidelines for co‐authors
: there are hundreds upon hundreds of (printed) books on typewriting, what makes this book different is extensive hyperlinking; note that Wikibooks holds back on interwiki (and interbook) linking, this book has to be self‐contained; write one sentence per physical line to facilitate readable diffs; use {{abbr|AE|American English}} spelling and grammar but indicate interchangeable vocabulary like this: elevator{{sup|{{abbr|AE|American English}}}}/lift{{sup|{{abbr|BE|British English}}}}
<!-- limit = 3 corresponds to <h3> [h3 being inclusive] -->{{TOC|limit=3}}{{clear}}
== typewriting ==
This section provides some background information.
Feel free to [[#supplies|skip it entirely]].
Note, similar to {{em|computer}}, a {{em|typewriter}} can refer to a person {{em|using}} a machine called {{em|typewriter}};
however, {{em|this}} use is – just like the word {{em|computer}} referring to a person – deemed archaic.
[[Image: Schreibmaschinen-Typen.jpg|thumb|alt=An array of levers featuring mirrored outlines of characters.|Terminology: In the (type) basket one (type) bar with a (type) slug at its top end is raised.]]
=== legacy ===
<!-- This section is about the legacy left {{em|by the machine}}. The habits people adopted and still show – such as writing abbreviations without intervening spaces {{mono|e.g.}} are not considered legacy for the purposes of this section. -->
* To this day ({{as of|2026|alt=2026 {{abbr|CE|common era}}}}) {{em|almost all computer keyboards}} use a {{em|staggered}} keyboard layout{{noprint|1={{hover info|the specific physical arrangement of keys}}}}, even though
** there is no mechanical need for that (there are no levers),
** there is not any consumer demand (anymore) to ease the transition {{em|from a typewriter}} to a computer keyboard,
** nor is it natural for humans’ fingers to move laterally.
* The predominant key mappings{{noprint|1={{hover info|the assignment of keys to characters or functions}}}} are based on the “QWERTY” typewriter keyboard mapping. However, it is {{em|inefficient}} to type English‐language texts, leave alone non‐English texts.
* On computer keyboards the {{key press|shift}} key is still called {{key press|shift}} even though it does not shift anything. On actual typewriters the {{key press|shift}} key {{em|actually moves}} the basket – the entirety of the assembly holding the type bars together – or carriage – the unit that holds the paper.
* Key tops are labeled as if there was only one key mapping. In fact the keyboard mapping can be changed electronically, the key labeled {{key press|D}} producing an {{code|A}} is no problem. There is no {{em|mechanical}} connection between the key {{key press|D}} producing a {{code|D}}.
* First a mechanical simplification utilized in typewriters, monospace{{noprint|1={{hover info|every character occupies the same amount of space as the other}}}} typefaces are still in use in some domains {{as of|2026|alt=to this day}}. You would think that once technology became advanced enough, i. e. supported proportional{{noprint|1={{hover info|characters occupy only as much space as necessary}}}} fonts{{noprint|1={{hover info|software used to generate typefaces}}}}, the typewriter baggage simply dies out, yet this is not the case.
=== preference ===
Few authors of novels – and not necessarily just those who grew up in the prime days of typewriters – claim they used typewriters because it facilitated and matched their authoring workflow;
for instance (esp. with {{em|non}}‐electric typewriters) undoing [[#mistakes|mistakes]] is difficult, kind of {{em|nudging}} you to keep on writing, not going back.
A {{em|typescript}} (typewritten manuscript) has the benefit that a publisher can perform {{abbr|OCR|optical character recognition}}, the computerized extraction of text from scanned images.
== supplies ==
Typewriters need paper and ink, and not just any paper and ink.
(Preparing masters for [[#hectography|hectography]] – a small batch replication method – is also possible, but {{as of|2026|lc=lc}} not explained in this book.)
[[Image: Hermes Rocket 1959 type specimen.png|thumb|alt=All letters a typewriter can produce next to a ruler marked in centimeters and inch.|Upon closer inspection the blot of white ink can be identified.]]
=== paper ===
==== color ====
Should you want to be able to correct typing mistakes with correction fluids or tapes, use {{em|white}} paper because the correction fluid or tape is {{em|primarily}} available in white.
Thus correcting typing mistakes on 100% recycling paper results in unsightly bright white spots, unnecessarily {{em|drawing}} the attention to the fact that you typed something wrong and had to correct it.
Other methods to correct typing mistakes are not as sensitive to the paper’s color;
still you get the best photocopies with white paper.
==== grammage ====
Typewriters can print on paper that has a certain range of grammage.
{{em|Grammage}} refers to the mass per area.
* If the paper is too thin, glyphs with eyes such as {{code|D}} or {{code|o}} may punch holes into the sheet. Less than about 75 {{abbr|gsm|grams per square meter}} is too thin. It is possible to “just” type lightly, but this tends to produce quite faint lettering, too.
* If the paper is too thick, the paper might not {{em|reliably}} advance. Consider anything in the neighborhood of 300 {{abbr|gsm|grams per square meter}} too much. You {{em|can}} still help push and hold your paper with a hand, e. g. for one‐time prints like business or place cards, however, the typewriter’s platen‐roller also {{em|curls}} the paper.
The most abundant retail paper has a grammage of 80 {{abbr|gsm|grams per square meter}} or 90 {{abbr|gsm|grams per square meter}}, so it is easy to obtain.
If you intend to produce carbon copies, choose the thinner paper of the two.
==== dimensions ====
{{anchor|maximum length}}
There is no actual {{em|maximum length}} – length referring to the secondary writing direction (for Latin‐based scripts like English usually downward).
Otherwise, there are maximum and minimum dimensions for sheets.
{{anchor|maximum width}}
The {{em|maximum width}} is dictated by the paper feed slot.
Keep in mind that the typewriter may not be able to type all the way to the (physically imposed) margins, neither is there usually any need.
{{anchor|minimum size}}
The {{em|minimum size}} needs to be tested.
If the paper is too small, it does not advance reliably, maybe even gets skewed because there is no sufficient grip.
It is recommended to simply write on a large sheet and {{em|cut it down}} to the desired size when finished.
Another method is to use a backing sheet, a larger paper, and secure the smaller one with paperclips.
=== ink ===
{{noprint|1={{wikipedia|ink ribbon}}}}
The necessary ink is stored on ribbons.
There are two types, the typewriter accepting only one of them:
* plastic film on one side coated with carbon (at least {{em|originally}}; different mixtures were {{em|in use since}}, yet it is {{em|still}} referred to as “carbon”)
* textile ribbons tinctured with ink
Both are available with either correctable or indelible ink{{noprint|1={{hover info|indelible ink is typically employed if documents need to be tamper‐evident and remain easily legible in several decades}}}}.
And to add insult to injury, there are various ribbon widths.
{{helpful hint
| title = privacy
| hint = Because of the gaps left on (correctable) carbon tapes, typed texts can usually be reconstructed, albeit without spaces and formatting.<!-- Textile ribbons {{em|may}} suffer from the same problem only upon first use. -->
}}
The plastic film comes in easy to install cartridges.
Since the carbon is transferred from the film to the paper, there are gaps:
this means the film is single use only.
Have replacement ready.
{{helpful hint
| title = re‐inking
| hint = Ensure the ink dries before winding it up. Moisture and poor ventilation, i. e. when wound up, facilitate grow of {{em|mold}}, another disadvantage.
}}
Textile ribbons deplete gradually.
They can be re‐inked (either automatically via a “sponge” or manually, although {{abbr|DIY|do it yourself}} can get pretty messy).
Unfortunately, textile ribbons also wear out.
=== accessories ===
Unavailable [[#characters|characters]] are augmented by hand.
Have a pen that matches the ink color and character line thickness.
To plan ahead [[#tabulation|tables]] or similar you may find graph paper – paper with a 5 mm grid printed on it – useful;
today, of course, you can use a computer and a text editor.
{{noprint|1={{wikipedia|correction fluid|correction tape|typewriter eraser}}}}<!-- omitted from print because URLs get printed in full, too, wasting a lot of space -->
Nobody is perfect.
Have correction fluid, correction tape, or razor/scalpel to [[#mistakes|delete typing mistakes]].
You can also use a special eraser, yet this produces detritus to be kept out of the machine.
Choose according to your requirements and preferences.
Alternatively, many electric typewriters can be equipped with a far more convenient correction tape.
There are two types:
* If a carbon‑C tape – {{em|C}} stands for {{em|correctable}} – is used, the ink can be removed with a lift‐off tape. This tape is comparable to adhesive tape.
* If {{em|indelible}} ink is used, there are whiteout tapes. They simply cover up the incorrect character; it is still there.
== operation ==
Typewriters are {{em|mechanical}} machines.
Some things may not work as smoothly as it used when the original manufacturer delivered them.
You may need to start with {{delink|[[#maintenance|maintenance]]}}.
=== environment ===
* A typewriter takes up space. Ensure the carriage can move all the way from left to right and you can still comfortably access the controls.
* The inertia of the carriage as it advances to the next character position may rock “light”‐weight portable typewriters enough to make them move on a smooth surface. Ensure you cannot easily push your typewriter sideways with your hand. Possibly place the typewriter on rubber like a place mat. Some rubber mat may be recommended anyway to decouple mechanical vibrations to some degree
* There are exceptionally {{em|quiet}} typewriters (“noiseless”), but in general typewriters are annoyingly '''loud'''. For prolonged work consider wearing ear protection. This may also aid your ability to concentrate. The sound is nonetheless valuable feedback that you have [[#strokes|{{em|properly}} struck a key]].
=== preparation ===
Some models feature a carriage lock.
The carriage lock ensures the carriage does not move back and forth during transport.
The carriage invariably locks {{em|at the center}} position.
The carriage lock lever is at a hard to reach location to prevent accidental locking, e. g. near the feet.
It may take a while to find it.
=== loading the ribbon ===
For stencils loading a ribbon is not necessary, maybe you even need to remove the ribbon if the typewriter does not allow to select a stencil mode.
# Remove the cover. In some models you shift the frame toward you. In others you have to lift the cover. In some sophisticated models the cover is hinged and you need to push a latch pin.
# Load the ribbon as explained below.
# Install the cover.
[[Image: Silver-Reed SR 200 in red-9542.jpg|thumb|alt=A ribbon spool visible when the typewriter’s cover is removed.|The spools sit entirely on the pin.]]
[[Image: Farbbandführung Schreibmaschine Wanderer 35.jpg|thumb|alt=A ribbon only partially held in the ribbon carrier.|Another method: use only one tooth on each side.]]
==== spools ====
The ink ribbon’s ends are attached to two spools.
# To facilitate even wear, you may want to label the spool: place a sticker on what shall be designated the top, indicate the winding/unwinding direction and maybe write the loading date. If you are a power user – someone who writes a lot with his typewriter on a regular basis – and do not intend to unload the ink ribbon, you can skip this step.
# There are two reel tables with pins the size of the spools’ central hole. Unwind the ribbon a bit and place both spools on the pin so that the ribbon wind/unwind {{em|on the far side}}, the side that is closer to the roller‐platen. Do not twist the ribbon. If the correct spools are used, the pins should stick out at the top. If not, rotate the spools a bit and {{em|lightly}} push them down. Especially in portable typewriters you may feel that the spools snap.
# Except in {{em|very}} old typewriters, there are two arms extending from the reel table with vertical slits. They can be moved laterally. These are part of the reverser mechanism. Place the ribbon in the slits. When reaching either end of the ribbon, the typewriter keeps pulling the ribbon: in consequence the tension exerted by the ribbon on the arm triggers a ribbon feed reversal.
# Thread the ribbon into the ribbon carrier ({{abbr|a. k. a.|also known as}} shaker or vibrator), the window that raises and falls down as you type characters. Using both hands, grab a short segment of the ribbon in the middle. Like flossing your teeth, use your thumbs to stretch this segment. Move it between the ribbon carrier and typing mask. In models that swivel the carriage (instead of shifting the basket, the assembly unit that holds all the type bars), you may have better access by [[#caps lock|using the {{key press|caps lock}}]].
# When descending the ribbon, switch from pushing to pulling: pull the lower edge of the ribbon and guide the ribbon downward so the lower teeth of the ribbon carrier become covered.
# Finally push down the upper edge past the gap and gently pull it toward you. Now straighten the ribbon so the upper teeth are covered, too.
# Turn either spool to remove {{em|excess}} slack. A {{em|little}} bit of slack is harmless. Note that {{em|one}} of the spools can only be rotated in one direction. This is correct.
==== cartridges ====
{{empty section}}
=== margins ===
Typewriters almost always have at least one margin delimiter.
The margin controls the area in the primary writing direction – the line length – you can write on.
The right‐hand margin is the imaginary vertical line on the paper not to be crossed when typing a line.
The left‐hand margin is the imaginary vertical line on the paper at which you start typing, more specifically on the right‐hand side of the line.
{{helpful hint
| title = standardization
| hint = {{abbr|ISO|International Organization for Standardization}} standard 838 expects that the margin to be punched with holes has a width of {{nowrap|20 mm – 25 mm}} {{nowrap|(ca. ¾ in – 1 in)}}.
}}
==== pitch ====
Today, margin requirements are usually expressed as a length.
However, you will not find a ruler on your typewriter marked in, say, millimeters.
{{noprint|1={{wikipedia|pitch (typewriter)}}}}
There {{em|are}} few typewriters that advance horizontally only so much as the character really needs, e. g. an I (eye) and l (ell) is narrow, whereas M advances a lot more.
By far most typewriters have a fixed {{em|pitch}}:
each character occupies exactly the same width as the other (“monospace”).
Horizontal pitch is expressed in {{em|character per inch}} (cpi), vertical pitch in {{em|lines per inch}} (lpi).
One inch is 25.4 {{abbr|mm|millimeters}}.
Take a ruler and align the zero mark with the zero mark on (any) ruler on the typewriter.
If the ruler marks inches, you can read the {{abbr|cpi|character per inch}} value directly at the 1" mark.
For rulers with a millimeter scale, read the character count at 127 {{abbr|mm|millimeters}} and divide it by 5.
The most common pitches are 10 or 12 {{abbr|cpi|characters per inch}}.
Some typewriters allow switching between the two, especially if the typeface is exchangeable.
{{editor note|§ Calculating the margins: needs more details, is not easy to understand. Refactor this.}}
Knowing your machine’s pitch allows you to {{em|calculate}}
# the sheet’s width expressed in character positions,
# the margin widths expressed in character positions, and thus
# how many character positions you need to subtract.
{{example
| 1 = DIN 5008
| 2 = For example,
* an {{abbr|ISO|International Organization for Standardization}} standard 216 size A4 sheet (210 {{abbr|mm|millimeters}} × 297 {{abbr|mm|millimeters}})
* is to be printed with a 10 {{abbr|cpi|character per inch}} (“pica”) machine
* leaving 25 {{abbr|mm|millimeters}} of margin on the left‐hand side and
* 20 {{abbr|mm|millimeters}} of margin on the right‐hand side.
# 210 {{abbr|mm|millimeters}} × 10 {{abbr|cpi|character per inch}} = 210 {{abbr|mm|millimeters}} × 10 {{abbr|ch|characters}} ÷ 25.4 {{abbr|mm|millimeters}} ≈ 82.68 {{abbr|ch|characters}}
#  25 {{abbr|mm|millimeters}} × 10 {{abbr|cpi|character per inch}} =  25 {{abbr|mm|millimeters}} × 10 {{abbr|ch|characters}} ÷ 25.4 {{abbr|mm|millimeters}} ≈  9.84 {{abbr|ch|characters}}
#  20 {{abbr|mm|millimeters}} × 10 {{abbr|cpi|character per inch}} =  20 {{abbr|mm|millimeters}} × 10 {{abbr|ch|characters}} ÷ 25.4 {{abbr|mm|millimeters}} ≈  7.87 {{abbr|ch|characters}}
# 82.68 {{abbr|ch|characters}} − 10 {{abbr|ch|characters}} − 8 {{abbr|ch|characters}} ≈  64.68 {{abbr|ch|characters}}
Some models feature an adjustable paper guide:
This is an edge in the paper feed slot you can move laterally.
It has a pointy mark indicating the position on the ruler.
Using the calculated information you set the paper guide preferably at −10 {{abbr|ch|characters}}.
If not available, shift all values by a constant, preferably a multiple of 10.
}}
==== adjustment ====
Knowing the required margins expressed as a character count you can adjust them.
Some typewriters have an “automatic” margin function.
You press some magic button and simultaneously move the carriage to the first or last position a character should appear.
{{anchor|margin tabs}}
More often than not you need to set the margins yourself.
For that – depending on the model – depress or lift the margin tabs.
The margin tabs are located close to the margin ruler, a numbered scale, in non‐electric typewriters at the far end of the carriage or anywhere close to the platen‐roller.
You may see an arrow, triangular arrow heading pointing toward the numbered ruler, or just a vertical line.
In some models it is not necessary to actually push the tab down,
* if you are adjusting the left‐hand margin in the leftward direction, and
* if you are adjusting the right‐hand margin in the rightward direction.
You can simply push them laterally.
# Move the carriage to a central position. The margins cannot be adjusted past the current position lest unless [[#margin release|released]]. To move the carriage rightward you can just push it. For leftward movement you can – beside repeatedly hitting {{key press|space}} – find a carriage release lever.
# Move the margin tabs.
==== margin release ====
In normal operations the carriage cannot be moved beyond the currently set margins.
However, there is a {{em|margin release}}:
The {{key press|margin release}} may be labeled {{key press|⇼}}, {{key press|∷}} or just {{key press|MR}}.
Press the margin release key to move past either margin.
When you {{em|were}} stopped by the right‐hand margin, you may {{em|hear}} that the carriage {{em|advanced}} upon pressing the margin release key.
Once you have passed either margin, let go of the margin release.
You only need to press the margin release key
* to move {{em|rightward}} across the {{em|right‐hand}} margin, or
* to move {{em|leftward}} across the {{em|left‐hand}} margin.
The opposite direction,
* moving {{em|rightward}} across the {{em|left‐hand}} margin, and
* moving {{em|leftward}} across the {{em|right‐hand}} margin
is always “allowed”.
Essentially, the margin release is “reset” whenever you enter the designated text area.
=== loading paper ===
You need to feed your typewriter with paper.
Typewriters take sheets.
There are
* no sprockets to advance continuous paper with perforated borders that can be teared away, so
* continuous paper may slowly veer to either side because it is not perfectly aligned.
To some degree you can label envelopes for letters, too.
# Possibly wash your hands if you just loaded the ribbon. You do not want to get smears of ink on the paper before you even started.
# Move the carriage to a center position. Usually this {{em|should not matter}}, but in some machines the paper may get stuck. To move the carriage rightward you can just push it. For leftward movement you can – beside repeatedly hitting {{key press|space}} – find a release lever.
# Usually you type on one sheet at a time. However, if applicable, prepare the stack of paper. For carbon copies place one carbon sheet {{em|between}} each paper. The black side faces the sheet to print on. The characters on the top sheet get their ink from the ribbon. Ensure all sheets have the same orientation in case you are using papers with a letterhead already printed on it. Align the borders by tapping the stack edge first on the tabletop. Be careful as to not to crinkle the carbon sheets.
# Insert the paper(s). There is a slot on the far side of the platen{{noprint|1={{hover info|{{word|en|platen}} is pronounced {{IPA|/ˈplætən/}}, like “platten”}}}}. If you are using paper that has a letterhead already printed on it, the front page should face away from you and the top is fed first. For plain blank paper the direction does not matter. If there are any carbon sheets, their black sides have to face the platen.
# Disengage the line spacer. The line spacer defines how much you advance in the secondary writing direction. It is either a lever on the carriage next to some single‐digit marks, or you can pull out the platen‐roller knob (usually the left one).
# Turn the knob of the platen‐roller. There are usually two knobs, one on each side. The right‐hand platen knob is turned clockwise, the left‐hand platen knob counter‐clockwise. As you twist either knob, the paper should be drawn into the machine now. If not, you may be using too thick paper, or you need to ensure the paper release is disengaged. As the paper emerges on the other side, you may need to guide it below the paper bail. Return the bail bar back to its normal position.
# Turn either knob so that roughly 50% of the paper is not in yet, 50% of the paper already sticks out front. In some models you have to {{em|lift the paper bail}}, that is the bar sometimes with numbered marks and possibly rollers sitting on top of the already written on paper. In some models the paper slips right under it {{em|without further ado}}, in others you have to push it there.
# Ideally you notice that the edges of the paper, the one in the back and the one in front of it, {{em|align}} perfectly. Should the paper not be aligned perfectly, pinch the papers (both back and front) at the top edge. Engage the paper release. You can now move the paper freely. Shift them individually so the corners align. If your typewriter does not have a paper guide at its feed slot, pay also attention the paper bail: you probably want the paper’s edge to appear at a certain mark. Now pinch the the papers together again and gently pull up (against the roller‐platen). Cautiously disengage the paper release. When disengaged, let go of the paper. One last visual check: while the line snap is disengaged twist the platen knob back and forth, so at the top the front and rear end alternate. If you notice any raggedness, repeat this step.
# Turn the roller‐platen back to the first line you want to write in. Note, while it is possible to write at the very top of the sheet, writing all the way to the bottom of the page is not possible: some paper has to remain in the machine for sufficient grip, otherwise it gets out of place and your text lines become bent. If you need text to appear all the way to the bottom, use larger paper and cut it down when finished.
# Engage the line spacer, and optionally erect the paper stand. The paper stand is one or two bars you can lift behind the paper feed.
{{choice
| 1 = {{anchor|side}} Single‐sided vs. double‐sided
| 2 =
Because of the {{em|embossing}} it creates on the other side, typewritten documents are usually {{em|single‐sided}} for {{em|purely esthetic<!-- alt. US spelling, see [[wikt:esthetic]] --> reasons}}. In some instances the front {{em|and back}} are always printed on, e. g. a post card or a last will and testament (not exceeding two pages) so as to not raise any doubt that it was {{em|one}} document. (As a side bar, in some jurisdictions a will has to {{em|be handwritten}} or else certified by a notary public.) It is apparent that the thicker the paper, the less pronounced the imprint and thus more acceptable to write on both sides.
}}
=== typing ===
{{helpful hint
| title = hyphenation rules
| hint = It is a sin to hyphenate across pages. In justified composition, at most two or three subsequent lines may be hyphenated.
}}
[[Image: Typewriter.JPG|thumb|alt=The left aspect of a typewriter.|Use the lever to advance the sheet and return the carriage to the left‐hand margin.]]
==== line ====
In most models, as you approach the right‐hand margin you will hear a bell ring.
Latin script typewriters are usually adjusted to ring the bell when you can still type at most 6 – 8 {{abbr|ch|characters}}.
This is a good point in time to consider wrapping the line.
If the margin is not too thin, it is generally acceptable to print {{em|punctuation}} like hyphens and periods past it;
use the [[#margin release|margin release]].
{{XWarning|With {{em|some}} models the carriage simply stops advancing once you reach the right‐hand margin. Before you know it you are typing multiple characters on top of each other. More sophisticated models arrest the type bars.}}
The carriage return lever performs two actions at once, return the carriage and advance to the next line.
It is the biggest lever you can find, attached at the left‐hand end of the carriage.
Push the lever rightward till the carriage is stopped by the left‐hand margin.
{{anchor|enter}}
Electric typewriters do not have a carriage return lever, but a new line {{key press|enter}} key.
Unlike the non‐electric counterparts, electric typewriters block typing any new letters while the carriage or type head returns to the starting position.
You should feel increased resistance if you try pressing any printing keys.
{{anchor|line spacer}}
The {{em|line spacer}} defines by how much you want to advance the paper when starting a new line.
It usually has at least three settings: 1, 1½ and 2.
These are {{em|factors}} to a reasonable line height, e. g. ⅙ {{abbr|in|inch}}.
This line height includes a little bit of leading – that is {{em|lead}} as in the chemical element.
To select the line height factor you may find a wheel or lever.
{{choice
| 1 = {{anchor|lh}} What line spacer setting should I use (for the main text body)?
| 2 =
If you intend to [[#superscript|superscript]] or [[#subscript|subscript]] text inside a paragraph, it may be wise to use the 150% setting. By using double spacing, you can insert words you forgot typing using the space between lines. Alternatively, if sufficiently wide, the margin can be utilized to supply missing words (in combination with some insertion mark).
Because of the uniform width of characters, typewritten texts are said to be more difficult to read in comparison to texts set with a proportional font. Consider adding vertical space just to aid legibility. On the other hand, it is a matter of practice; for instance hanzi (“Chinese characters”) are placed in uniform square boxes and nobody is complaining about that.
}}
The line spacer can be disengaged.
Some typewriters integrate disengaging the line spacer as a setting 0 (zero).
[[Image: Typewriter, portrait, office, workplace, interior, desk, lady Fortepan 5050.jpg|thumb|alt=A lady sits in front of a typewriter.|reasonable typing position]]
==== strokes ====
Users of electric typewriters simply touch the keys.
Just ensure it is switched on.
With mechanical typewriters the user has to muster the necessary force all on his own.
A proper stroke is resolute – quick attack and quick release.
Try a faint touch, try slow motion, it will not print.
The keys travel quite far in comparison to electric typewriters.
You want to apply all force in the {{em|downward}} direction, yet {{em|your arms}} should {{em|barely}} move.
Therefore sit upright and have the typewriter {{em|just a bit}} above lap height.
The {{em|regular}} desk height you use to comfortably write with a pen on a piece of paper {{em|is too high}}.
Moreover, should your finger slip they may get entangled between the keys.
For small face characters like the period ({{code|.}}), comma ({{code|,}}), colon ({{code|:}}) and semicolon ({{code|;}}) a {{em|light}} tap is sufficient;
especially if the period or comma are hit with full force you may inadvertently print the top area, too, creating bit of an angry vibe, period!
Furthermore, it {{em|may}} punch a [[#side|hole in the paper]] or even damage the ribbon.
If you are producing carbon copies, it is of import to strike keys with more force than usual.
An electric typewriter is therefore ideal for such a job.
Typing [[#mistakes|mistakes]] need to be corrected separately, in the original and each and every copy.
{{helpful hint
| title = performance
| hint = Typing speed is measured in {{em|strokes per minute}}, pressing {{key press|shift}} being counted, too, {{em|in addition}} to the actual letter key.
}}
{{anchor|jam}}
If you are typing {{em|fast}} on a typewriter using type bars – the levers that strike the paper – as opposed to type heads, you may be {{em|stopped}} by one bar holding up another one thus blocking the typing window.
This {{em|jam}} requires manual intervention.
Ensure you pull down the type bar {{em|closest}} to you first so as to not accidentally bend the levers.
{{Exercises|1=
Type a character sample sheet. In other words, type something {{em|like}} the following, obviously resembling the {{tooltip|keyboard layout|the specific physical arrangement of keys}}:
<syntaxhighlight lang='text' style='line-height: 150%; white-space: pre; page-break-inside: avoid;'>
Typewriter Model Make, manufactured 2028, serial number 123456
1 2 3 4 5 6 7 8 9 + ß ´
q w e r t y u i o p ü
a s d f g h j k l ; ä
z x c v b n m , . -
; " = % & ( ) ' § / : `
Q W E R T Y U I O P Ü
A S D F G H J K L Ö Ä
Z X C V B N M ? ! _
</syntaxhighlight>
The staggering, the lateral position of each character, corresponds to the arrangement of type bars, the levers, in the basket (of course only applicable if you use a typewriter with type bars). Ensure that in the final document in each of the blocks no two characters are above each other.
}}
If one letter, one type bar persistently does not seem to return, you may have the idea that you needed to lubricate the machine.
However, oiling the segment – the solid arced block with slits holding the type bars – may be {{em|inadvisable}} because it is {{em|hard to clean}};
over time accumulating dust in combination with oil produces icky goo making the type bars {{em|even harder}} to fall back.
{{clear}}
==== capital letters ====
There are {{em|very few}} typewriters that have {{em|two}} sets of keys:
one for majuscules{{noprint|1={{hover info|the typographic term for upper‐case letters}}}} and one for minuscules{{noprint|1={{hover info|the typographic term for lower‐case letters}}}}.
The predominant pattern, however, has only one set of keys.
By default the letter keys produce minuscules.
You need to press either {{key press|shift}} key.
They may be unlabeled.
One is left of the {{key press|Z}}, the other one at the far right in the same row.
Unlike keyboards for electronic devices – including electric typewriters – you do not need to ensure the {{key press|shift}} key is pressed {{em|before}} hitting the letter key.
You can press {{key press|shift}} and the desired letter in sync, {{em|simultaneously}}.
In mechanical typewriters both mechanisms are independent from each other.
{{anchor|caps lock}}
{{noprint|1=[[File: Wagenheber einer Schreibmaschine.webm|thumb|{{key press|caps lock}} in action]]}}<!-- omitted from print because it is a video -->
In modern typography, headings are set with a {{em|larger}} font{{noprint|1={{hover info|set of glyphs following a common design}}}} size and possibly {{em|heavier}} weight{{noprint|1={{hover info|thin and thick lines}}}}.
Some premium typewriters have exchangeable type heads, but more often than not you are “stuck” with a {{em|single}} font size and weight.
If [[#underlining|underlining]] or similar is insufficient, you may want to type a title in all‐caps.
# To facilitate this, typewriters frequently feature a {{key press|caps lock}} key. It is the key immediately above {{em|the left}} {{key press|shift}} key and may also be unlabeled or called {{key press|shift lock}}. If you press {{key press|caps lock}} you will feel a snap. It often moves in unison with all {{key press|shift}} keys.
# Now you can type upper‐case letters {{em|without}} pressing {{key press|shift}}. However, note that digit and punctuation keys also produce {{em|their shifted}} meaning. All‐caps titles may benefit from added horizontal spacing, but only a little bit; one whole space character is already too much, so you need to [[#space out|use the semi‐step mechanism]].
# {{key press|Caps lock}} is a “one‐way” key: To unlock the {{key press|caps lock}} you press either {{key press|shift}} key{{noprint|1= (watch the video and pay attention which key is pressed)}}. Unlike computer keyboards, pressing {{key press|caps lock}} when it is already “activated” will {{em|not reverse}} its effects.
Historically, telegrams were often written in all‐caps, some typewriters even had {{em|only}} upper‐case letters.
An orator may appreciate if his speech is written all‐caps, as he may find it easier to read.
To facilitate this practice in few typewriters the comma ({{code|,}}) and period ({{code|.}}) are left unaffected by the {{key|shift}} key.
You may notice that the {{key press|.}} and {{key press|,}} have their respective characters printed on them {{em|twice}} telling you that releasing {{key press|caps lock}} is not necessary.
=== mistakes ===
# {{em|Assess}} the situation. A number of mistakes can be corrected by clever use of the typewriter. Let’s say you meant to type capital {{code|E}} but – just for purpose of giving an example – typed a capital {{code|F}}. To remedy the situation, simply go back and type the {{code|E}}. It may not look perfect – in particular if the {{code|F}} dons a serif at its foot – but it works.
# Either flag the mistake – put a small adhesive slip on the original – to postpone it, or {{em|apply}} the correction immediately as described in the subsections.
# If there are too many mistakes on a page, consider taking a break and {{em|starting over}}. There is no satisfaction in a poorly typed page.
[[Image: CarbonFarbband mit Lift-off-Korrektur.jpg|thumb|alt=The digit one in black on white paper. Next to it grooves of the digit two.|You cannot undo the impression: You can discern the <code>2</code>.]]
==== errors ====
There are correction fluids and tapes available.
# For convenient access of the mistyped part, advance the paper by a couple lines first.
# Now simply cover the incorrectly typed characters.
# If applicable, ensure the paint is dried. Make it a habit and {{em|always}} give it a gentle blow, regardless whether it is really necessary.
# Return to the first elided position and – hopefully – type the {{em|correct}} character(s).
For {{em|bulk corrections}} or if the paper is not in the correction fluid’s or tape’s color (i. e. not white), type the correction on a separate piece of paper, cut it out and glue it in the proper place.
Evidently, this correction needs to be postponed till the page is finished.
If your typewriter is equipped with a lift‐off tape, press the {{key press|⌫}} key and now type {{em|the incorrect}} character as printed.
While the erase function is enabled, the lift‐off tape is raised, not the carbon film.
After having typed one printing character, the erase function is disabled.
The type head stays at its current position so you can immediately type {{em|the correct}} character.
{{helpful hint
| title = {{abbr|CC|carbon copy}} perfection
| hint = The thickness of the copy papers and carbon sheets add up to the roller‐platen diameter. Expect more slippage than usual. Avoid unnecessary scrolling.
}}
If you are making {{abbr|CCs|carbon copies}} and want to correct a mistake with the typewriter, consider advancing the stack by a couple lines and temporarily inserting scrap sheets between every copy and its corresponding carbon paper.
Return to the correct line and the correcting character gets printed on the scrap sheets.
Before continuing writing, remove the scrap sheets.
This ordeal ensures the newly printed characters are perfectly aligned with the line and everything, something hard to achieve if you {{em|reloaded}} the paper.
{{anchor|x-ing}}
A {{em|fast}} method to rectify mistakes is {{em|overprinting}} incorrect parts:
Return the carriage or type head to the position of the first incorrect character.
Repeatedly strike {{key press|x}} or {{key press|/}} while the cursor is above incorrectly typed characters.
As convenient this method is, it is particularly ugly.
However, it is generally an acceptable compromise {{em|for carbon‐copied}} documents, amending each copy individually being awfully time‐consuming and risking damage.
Of course, ugliness is of no concern for {{em|drafts}} or other one‐time use documents.
==== omissions ====
If you {{em|forgot typing {{em|one}} character}}, you can use the semi‐step mechanics.
Many typewriters actually advance by one character cell in two steps.
Return to the character position preceding the insertion position.
Press {{em|and hold}} the space bar.
Now type the character to be inserted.
You may furthermore want to consider to [[#superscript|superscript]] the character.
Temporarily scroll back by one half line.
{{helpful hint
| title = paragraphs
| hint = Paragraph breaks are either indicated by vertical blank space, or by indenting the first line but without vertical space. Do not indent the first line {{em|and}} add vertical blank space at the same time. Outdenting (“negative” indentation) is rarely done with typewriters.
}}
=== tabulation ===
To facilitate the creation of lists and tables or just to quickly indent the first line of a paragraph, some typewriters are equipped with a fast‐forward key.
There are two mechanisms:
* The user can define {{em|tabulator stops}} and pressing <!-- {{key press|TAB}} not listed because it features arrows in both directions --> {{key press|⇥}} jumps to the next tab stop. This gives the users maximum flexibility, yet the mechanics are also pretty heavy. This kind is usually only found in desk typewriters.
* Pressing <!-- {{key press|TAB}} not listed because it dons arrows in both directions --> {{key press|⇥}} advances to the next character position divisible by 10 ± some offset. 10 is the most common value and cannot be changed. This mechanism is sometimes present in “light‐weight” portable typewriters.
Either mechanism is suitable to create {{em|left‐aligned}} itemizations.
Aligning the radix mark (i. e. in English the decimal point) of numbers of varying length still requires manual alignment.
To set and reset tabulator stops, there are either {{em|two}} keys – {{key press|CL}} to clear, {{key press|SET}} to set a tabulator stop – or there is a tabulator control lever or swivel key.
It is labeled with a plus and minus sign, or unlabeled but plus and minus signs are found next to it on the typewriter frame.
* By pushing the control in the direction of the plus sign, you {{em|set}} a tabulator stop {{em|at}} the current position.
* By pushing the control in the direction of the minus sign, you {{em|cancel}} the tabulator stop {{em|at}} the current position (if any is set).
To type an itemization using the tabulation mechanics, proceed as follows:
# Clear all tabulator stops. Some typewriters have a small lever on the carriage to clear all tabulator stops at once. Others require you to return the carriage, press {{em|and hold}} the {{key press|CL}} key or the tabulator control lever in the direction of the minus sign, and press <!-- {{key press|TAB}} not listed because shows arrows in both directions --> {{key press|⇥}}. The carriage scoots to the right‐hand margin canceling all tabulator stops. To verify your success, if you return the carriage and press {{key press|⇥}}, the carriage should glide all the way to the right‐hand [[#margins|margin]] now.
# Advance to the position where the carriage should stop. Push the tabulator control in the direction of the plus sign and release. Repeat this step as required. Because tabulation stops are “stored” as {{em|little}} pins, it may be recommended to keep stops {{em|at most}} 5 to 15 character positions apart. The heavy carriage {{em|smashing}} with all its mass into a tabulation stop pin is quite some stress. Of course you can always simply use one hand and slow down the carriage as you tab.
# Type the itemization and use the {{key press|⇥}} key to advance to the beginning of the next cell. You {{em|can amend}} tabulator stops as you go, e. g. because table cells are merged or split up.
Even without a neat tabulation mechanism, some typewriters feature a “slow” forward {{key press|↠}} key (sounding like “automatic (gun‑)fire”).
With some practice you get used to its pace and can jump forward quickly.
=== unloading paper ===
When you have finished typing up the current page:
# Optionally proofread the page and fix any mistakes while you can. {{em|Reloading}} the page following {{em|exactly}} the same line rhythm is difficult, so this is the last chance to fix any mistakes.
# Engage the paper release. It is usually a lever found on the carriage. This removes pressure from the rollers beneath the roller‐platen. The paper can move freely now.
# Pull the stack of sheets out of the machine and lay them in the working area of your desk.
# Disengage the paper release for subsequent operation.
# If applicable, separate any carbon sheets. Be careful as to not to crinkle them.
# If applicable, make amendments you postponed, e. g. filling in missing [[#characters|characters]].
# If you are super‐organized, you place the finished pages in a tray collecting all pages of one document.
=== end of work ===
# {{anchor|flat spot prevention}} Engage the paper release. Prolonged pressure to the rollers at one point may make them flat. Flat spots convey the paper poorly. On the other hand, this puts stress on the paper release spring so it may wear out and actually decrease the pressure the rollers exercise. Rest assured, springs as well as rollers can be replaced; replacement rollers are now marketed as parts for electronic printers.
# Select the easiest setting for everything else, for instance disengage {{key press|caps lock}}.
# The ink in the ink ribbon is adjusted to not dry out for several months. It is not necessary to remove the ribbon after each use. Moreover, unloading exposes the ribbon to the risk of damage. Unloading the ribbon is essentially [[#loading the ribbon|loading the ribbon]] in reverse. Carbon films and correction tapes can stay indefinitely.
# Dust accumulation is bad. Return the carriage to a center position and cover the typewriter e. g. with a nonfuzzy towel. Portable typewriters intended for travel come with a lid turning the typewriter–lid unit into a suitcase.
== glossary ==
=== procedures ===
; {{anchor|form}} forms
: To fill out forms you need to disable the line advance snap. This allows to freely align the form vertically. Depending on the model you just pull the paper drum knob, turn a wheel or lever. It may be integrated in the line advance length selector and labeled 0 (zero). For form fields of limited length, be sure to consult the ruler to count the characters you can type, maybe necessitating condensing the intended entry.
; {{anchor|hanging punctuation}} hanging punctuation
: Justified composition may produce an {{em|u}}n{{em|s}}t{{em|e}}a{{em|d}}y right‐hand margin: commas, hyphens and periods are predominantly white characters. Despite the justified composition the right‐hand margin {{em|optically}} appears to {{em|be ragged}}. The solution is to insert a half‐space within the line. If you do not want to utilize a computer {{em|to plan}} this much ahead, first type a left‐aligned version just like usual. Use this version to count and indicate where to place extra spaces. Each line that ends on a period, comma or dash gets another half space. That means for the second half of the line you press {{em|and hold}} the {{key press|space bar}} before typing any character.
; {{anchor|hectography}} hectography
: Typewriters that accommodate for dual‐[[#colors|colored]] ribbons usually also have a blank setting. If not remove the ribbon.
; {{anchor|letterspacing}} letterspacing
: Type one space character between every character. That also means to type an intervening space you hit {{key press|space}} {{em|three}} times in a row. See [[#space out|§ space out]] for the favored more sophisticated method.
; {{anchor|dashed lines}} lines, dashed, horizontal, vertical or diagonal
: A vertical dashed line can be achieved by putting straight apostrophes ({{code|'}}) beneath each other. A horizontal dashed line is achieved by repeatedly typing dashes ({{code|-}}). {{em|If}} their angle/orientation is right, diagonal dashed lines can be achieved with the accents {{code|´}} and {{code|`}}. Because of the varying line lengths of these characters and not worth mentioning the spacing between them, diagrams employing dashed lines in multiple directions may look inconsistent.
; {{anchor|dotted lines}} lines, dotted, horizontal, vertical, or diagonal
: For horizontal dotted lines, repeatedly type the period ({{code|.}}). For vertical dotted lines, type period, use the {{key press|backspace}}, advance the line feed by half a line and type a period again. Alternatively hold the spacer and type periods as you advance the roller‐platen. Repeat as appropriate. For a denser vertical line you can also employ the colon ({{code|:}}).
; {{anchor|solid lines}} lines, solid, horizontal or vertical
: Some typewriters have a groove in the typing mask. Place a pen here and move the carriage for horizontal lines (hold the carriage release for that), or {{em|retreat}} the paper for vertical lines ({{em|advancing}} the paper can make it difficult to see where to stop).
; {{anchor|perforation}} perforation
: To perforate thin enough paper – e. g. a reply form beneath a letter body or phone number strips to tear from a bulletin board posting – use [[#dotted lines|dotted lines]] with {{em|even less}} spacing. Due to their small face area it is usually not necessary to apply extra force when typing. Consider selecting the non‐printing stencil mode or removing the ribbon since the ink is usually not necessary.
; {{anchor|space out}} space out
: Many typewriters actually advance in {{em|two}} steps. Upon pressing any printing key (including {{key press|space}}, excluding “dead” keys) the carriage (or type head) advances by one half character width, and once {{em|all}} keys are released the carriage advances {{em|another}} half character width. This semi‐step mechanics can be utilized to add horizontal space, esp. desirable in [[#caps lock|all‐caps titles]]. First, type a character as usual. Next hit {{em|and hold}} the {{key press|spacer}}. This “adds” just {{em|one half}} of space. Now type the next character. Release the {{key press|spacer}} and strike it as usual. Repeat these steps as appropriate. Should this mechanism not supported by your typewriter, resort to [[#letterspacing|letterspacing]]. Letterspacing, however, adds {{em|too much}} horizontal space.
[[Image: Olympia typewriter - German keyboard layout-9609.jpg|thumb|alt=A lever next to black, white and red-colored spots.|Example color selector. If loaded correctly, in this setting the black part of the ribbon prints.]]
=== markup ===
Markup options are severely limited, yet they are {{em|not}} none.
; {{anchor|bold}} bold
: To some degree bold text can be produced by typing the same letters again. Use the {{key press|backspace}} to return to the starting position. On the other hand this may increase the likelihood of punching through the paper (e. g. creating holes). You can always simply manually retrace the character with a pen after you have finished typing the page.
; {{anchor|colors}} colors
: There are dual‐colored ribbons and typewriters that allow selecting between the top and bottom portion of the ribbon. Note that carbon copies remain monochrome regardless.
; {{anchor|double underlining}} double underlining
: Advance either one whole or just one half line. Use the equal <!-- no link to [[#equal sign]] because it would be awfully inconvenient --> sign {{code|1==}} to produce double underlines. Hit and hold {{code|1==}}, depress the space bar and hit {{code|1==}} again, release both keys and repeat as appropriate. If you have advanced {{em|just one half line}}, you may want to skip underlining for descenders ({{code|g}}, {{code|j}}, {{code|p}}, {{code|q}}, {{code|y}}, and possibly parentheses, {{code|f}} and the capital {{code|Q}}, too).
: Alternatively, use the same method as [[#underlining|underlining]] twice, with vertical displacement applied to the second time. The vertical distance between the underlines may be considered too wide, though.
; {{anchor|overlining}} overlining
: See [[#underlining|underlining]] except that the underline is produced for the preceding line and you may want to skip any inch signs ({{code|"}}). Keep in mind that overlining may be confused for underlining.
; {{anchor|strike|strikethrough}} strikethrough
: The underscore used for [[#underlining|underlining]] cannot necessarily be aligned properly. Instead use the hyphen‐dash. However, the dash is too short, you need to hit and hold the dash, then hold the space bar and hit the dash {{em|again}}. Now release both keys and repeat as appropriate.
; {{anchor|subscript}} subscript
: Advance the paper by half a line. This requires turning the roller‐drum manually; the lever advances the paper by at least one whole line and you may accidentally move the carriage, too. When you are done, turn the roller‐platen back by half a line. In {{em|proper}} typesetting the [[#typeface|font]] size has to be reduced, too, but this cannot be achieved with a typewriter.
; {{anchor|superscript}} superscript
: See [[#subscript|§ subscript]], taking into consideration that you roll back the paper by half a line {{em|upward}}.
; {{anchor|typeface}} typefaces
: There are typewriters that have replaceable type heads; spheres or discs are common forms. In other typewriters the typeface is an integral part. If the typeface conveys meaning – such as variable names in mathematics and sciences – consider writing them with a pen by hand.
; {{anchor|underlining}} underlining
: Many typewriters feature an underscore character ({{code|_}}). This character is wide enough so repeatedly striking it creates one {{em|continuous}} underline. You may want to consider skipping descenders ({{code|g}}, {{code|j}}, {{code|p}}, {{code|q}}, {{code|y}}, and possibly parentheses, {{code|f}} and the capital {{code|Q}}, too). See also [[#double underlining|double underlining]] and [[#solid lines|solid lines]].
; {{anchor|zig‐zag underlining}} underlining, zig‐zag
: A zig‐zag underline may be achieved by stringing [[#caret|carets ({{code|^}})]] together in the next line at a semi‐step.
{{helpful hint
| title = symbol curiosity
| hint = [[Image: German typewriter 'Torpedo' from WWII with double Siegrune symbol of the SS (Schutzstaffel) instead of number "zero".jpg|frameless|alt=A key of a typewriter labeled with a rune double S symbol instead of a zero.]]
In {{abbr|Nazi|National Socialist}} Germany typewriters with dedicated “lightning‐bolt” {{lang|de|{{abbr|SS|Schutzstaffel}}|italic=unset}} types were in use. Few even featured a <span title='swastika' style='display: inline-block; transform: rotate(45deg);'>࿕</span> key.
}}
=== characters ===
Through clever combination and positioning, you can type more characters than 40‐something keys/types provide, sort of.
These are all {{em|workarounds}} and do {{em|not}} meet the quality standards in {{em|professional}} typography.
{{CompactTOC8
| name = character name
| center = yes
| a = [[#CHARACTER-A|A]]
| b = [[#CHARACTER-B|B]]
| c = [[#CHARACTER-C|C]]
| d = [[#CHARACTER-D|D]]
| e = [[#CHARACTER-E|E]]
| f = [[#CHARACTER-F|F]]
| g = G
| h = [[#CHARACTER-H|H]]
| i = [[#CHARACTER-I|I]]
| j = J
| k = K
| l = [[#CHARACTER-L|L]]
| m = [[#CHARACTER-M|M]]
| n = N
| o = [[#CHARACTER-O|O]]
| p = [[#CHARACTER-P|P]]
| q = [[#CHARACTER-Q|Q]]
| r = [[#CHARACTER-R|R]]
| s = [[#CHARACTER-S|S]]
| t = [[#CHARACTER-T|T]]
| u = [[#CHARACTER-U|U]]
| v = V
| w = W
| x = X
| y = Y
| z = [[#CHARACTER-Z|Z]]
}}
; {{anchor|CHARACTER-A}} {{anchor|á}} á
: Hit {{code|´}}. This is usually a “dead key”, that means it does not advance the carriage. Now type {{code|a}}. Evidently, this is opposite the customary writing order: using a pen the base letter is written first and accents are added second.
; {{anchor|â}} â
: Hit {{code|´}} and {{code|`}}; this is usually one “dead key”, that means it does not advance the carriage or type head. Now type {{code|a}}.
; {{anchor|æ}} æ
: Hit and hold {{code|a}}, press the space bar and release {{code|a}} and type an {{code|e}}. Note that the majuscule Æ cannot be produced in this fashion.
; {{anchor|ampersand}} ampersand
: See [[#et ligature|&]].
; {{anchor|apostrophe|’}} ’
: Most of the time you simply use the straight tick ({{code|'}}), but to get a nine‐shaped apostrophe type a [[#superscript|raised]] comma. In German the apostrophe is also known as {{lang|de|Hochkomma}}, literally meaning elevated comma.
; {{anchor|eight-spoked asterisk|✳}} ✳
: With a sans‐serif{{noprint|1={{hover info|without serifs (serifs are additional lines, e. g. horizontal lines added to a capital eye {{code|I}})}}}} typeface you can superimpose a {{code|+}} and {{code|x}}. It looks more {{em|rectangular}} than round though.
; {{anchor|at|@}} @
: {{em|At}} is conventionally substituted by an {{code|a}} overlaid with a slash {{code|/}}. Obviously without the arc it does not look anything like the {{code|@}} sign. You may want to consider spelling out the word {{em|at}} instead, possibly putting it in parentheses: {{mono|(at)}}).
; {{anchor|CHARACTER-B}} {{anchor|¦|broken bar}} ¦
: If the straight apostrophe is long enough, but not too long, type a {{code|'}}, {{key press|backspace}}, advance the platen by half a line and type another {{code|'}}. Scroll back by one half line before you continue writing.
; {{anchor|bullet|◦}} ◦
: Just type an {{mono|o}}.
; {{anchor|CHARACTER-C}} {{anchor|ç}} ç
: It may not produce a satisfactory result but you can try combining {{code|c}} with a comma ({{code|,}}).
; {{anchor|©}} ©
: The copyright sign is conventionally approximated as [[wikt:(c)|{{code|(c)}}]].
; {{anchor|care of|℅}} ℅
: Reverse the paper by one half line, hit and hold {{code|c}}, press the space bar, advance the paper by one half line, type a {{code|/}}, release all keys and type one {{code|o}}.
; {{anchor|caret}} ‸
: Advance to the next line, hit {{code|´}} and {{code|`}}; this is usually one “dead key”, that means it does not advance the carriage.
: Alternatively, finish writing the page, load the paper again upside‐down, disable line snap, and after careful adjustment type a {{code|v}}.
; {{anchor|cent}} ¢
: The cent sign is substituted by overlaying the minuscule {{code|c}} with a forward slash {{code|/}}. The {{em|proper}} glyph has a {{em|vertical}} line sticking out by the same amount at the top and bottom. Considering spelling out the word {{em|cent}} if the reader may not recognize the substitution as {{code|¢}}.
; {{anchor|commercial minus sign|٪|⁒}} ⁒, ٪
: Roll back by one half line, hit and hold period {{code|.}}, depress the space bar and release the period, advance the paper by one half line, type a slash {{code|/}}, release all keys and type one final period {{code|.}}.
; {{anchor|CHARACTER-D}} {{anchor|đ}} đ
: The version with a stroke through the (upper) stem can be achieved this way: Hit and hold {{code|d}}, press the space bar, release {{code|d}}, and type a {{code|t}}.
; {{anchor|Đ}} Đ
: Hit and hold dash ({{code|-}}), press and hold the spacer, release the dash key, and type a capital {{code|D}}.
; {{anchor|db|ȸ}} ȸ
: Press and hold {{code|d}}, press and hold the spacer, release the {{code|d}} and type a {{code|b}}.
; {{anchor|degree|°}} °
: The degree sign is approximated by a [[#superscript|superscript]] {{code|o}} (minuscule oh). A {{em|perfectionist}} may hold and turn the roller‐platen knob {{em|slightly}} backward.
; {{anchor|division sign|÷}} ÷
: It may not produce satisfactory results, but try to overlay a colon ({{code|:}}) with any of the horizontal lines.
; {{anchor|dollar sign|$}} $
: A single stroke dollar character can be substituted by overlaying the {{code|S}} with a slash ({{code|/}}).
; {{anchor|double dagger|‡}} ‡
: Type a plus {{code|+}}, hit {{key press|backspace}}, roll back the paper by half a line and type {{code|+}} again. There may be a small gap between the plus signs. Advance the paper by half a line to return to the baseline.
; {{anchor|CHARACTER-E}} {{anchor|emdash}} em dash
: An em dash ({{code|—}}) can be approximated by hitting and holding the hyphen‐dash key, pressing the space bar and then hitting the dash key again. Release both keys and hit the dash key one more time. If efficiency is more important, simply striking {{code|-}} three times will do.
; {{anchor|endash}} en dash
: An en dash ({{code|–}}) can be approximated by hitting and holding the hyphen‐dash key, pressing the space bar and then hitting the dash key again. Note that a parenthetical en dash usually needs to be surrounded by space.
: Alternatively, if available and wide enough, consider the [[#superscript|raised]] underscore ({{code|_}}) the en dash character.
: If efficiency matters, simply type {{code|-}} twice {{em|without}} going great lengths at making the dashes overlap.
; {{anchor|equal sign}} =
: Some models lack a proper equal sign. Type a dash {{code|-}}, use the {{key press|backspace}}, now firmly hold the roller‐platen knob and advance the paper {{em|just}} a {{em|tiny}} bit ({{em|before}} it snaps to the next position), and type a dash again.
; {{anchor|et|et ligature}} &
: This character is conventionally expanded to {{mono|et}}, the Latin word for {{em|and}}.
; {{anchor|exclamation point}} !
: If the straight apostrophe {{em|is long enough}}, you can overlay {{code|'}} with a period ({{code|.}}).
; {{anchor|CHARACTER-F}} {{anchor|ff|ff}} ff
: Hit and hold {{code|f}}, press space, and type {{code|f}} again.
; {{anchor|ffi|ffi}} ffi
: Hit and hold {{code|f}}, press space, type {{code|f}} again, release both keys and type an {{code|i}}.
; {{anchor|ffl|ffl}} ffl
: Hit and hold {{code|f}}, press space, type {{code|f}} again, release both keys and type an {{code|l}}.
; {{anchor|fi|fi}} fi
: Hit and hold {{code|f}}, press space, release {{code|f}} and type an {{code|i}}.
; {{anchor|fl|fl}} fl
: Hit and hold {{code|f}}, press space, release {{code|f}} and type an {{code|l}}.
; {{anchor|CHARACTER-H}} {{anchor|hash}} hash
: See [[#octothorp|octothorp]].
; {{anchor|CHARACTER-I}} {{anchor|infinity|∞}} ∞
: With a sans‐serif typeface you may get an acceptable result by combining {{code|o}}, {{code|x}}, {{code|o}} at a semi step width.
; {{anchor|interrobang|‽}} ‽
: By overlaying {{code|!}} and {{code|?}} you get {{code|‽}}.
; {{anchor|CHARACTER-L}} {{anchor|ł|barred l}} ł
: It does not look like the proper character, but overlay {{code|l}} with a slash.
; {{anchor|Ł|barred L}} Ł
: It does not look like the proper character, but overlay {{code|L}} with a slash.
; {{anchor|CHARACTER-M}} {{anchor|minus|−}} minus
: A minus sign ({{code|−}}) is rendered using a hyphen‐dash ({{code|-}}) or an [[#endash|en dash]]. The important thing is that the line is at the same height as the horizontal in {{code|+}}. See also [[#commercial minus sign|⁒]].
; {{anchor|multiplication|times|×}} multiplication
: The multiplication cross ({{code|×}}) is rendered using the regular character {{code|x}}. This works best with typefaces without serifs. Of course an {{code|x}} may be confused for {{em|the variable}} {{code|x}}. Alternatively use a multiplication dot by typing a period ({{code|.}}); a [[#superscript|superscript]] period does not work, though, hence the period stays at the baseline.
; {{anchor|CHARACTER-O}} {{anchor|Ø|∅︀}} Ø, ∅︀
: Type capital {{code|O}}, use the {{key press|backspace}} to return to the previous position and type the forward slash {{code|/}}. The corresponding minuscule ø, however, cannot be produced this way, at least not in a satisfactory manner.
; {{anchor|ɵ}} ɵ
: Overlay an {{code|o}} with an {{code|e}}: Type an {{code|o}}, then {{key press|backspace}} and type an {{code|e}}. Do not type too hard as to not punch a hole in the paper.
; {{anchor|octothorp}} #
: Press and hold {{code|1==}}, press the space bar and type {{code|1==}} again. {{key press|Backspace}} and hit and hold {{code|/}}, press the space bar and type {{code|/}} again.
: You can {{em|fine‐tune}} this procedure. Type a {{code|1==}} just like before. Then {{key press|backspace}}. Now possibly engage {{key press|caps lock}} to access the {{code|/}}. Before actually typing the first {{code|/}}, gently push and hold the {{key press|backspace}} key a little bit. Observe how the carriage moves {{em|a small amount}} to the left. In that position hit the {{code|/}}. Remove pressure from the {{key press|backspace}} key. For the second {{code|/}} block the left‐hand end of the carriage with your hand. It should not move. Now press the space bar. If you held the carriage firmly enough, it should have moved just a tiny bit to the right. In that position type {{code|/}}. Do not worry, this positioning may need multiple attempts. When done, do not forget to disengage the {{key press|caps lock}}.
: A tall upright octothorp can be achieved with pluses: Press and hold {{code|+}}, press and hold the space bar, now type a {{code|+}} again. After releasing all keys, {{key press|backspace}} and repeat the previous step as [[#superscript|superscripted]] text. However, there may be a small gap between the plus sign rows.
; {{anchor|œ}} œ
: Hit and hold {{code|o}}, press the space bar and release {{code|o}} and type an {{code|e}}.
; {{anchor|Œ}} Œ
: Same procedure as [[#œ|œ]] just with capital letters.
; {{anchor|one}} one
: The digit {{code|1}} may be missing. Type a minuscule ell ({{code|l}}) instead. In Roman numerals a {{em|one}} is still typed as a capital eye ({{code|I}}).
; {{anchor|CHARACTER-P}} {{anchor|℗}} ℗
: The sound recording copyright sign is conventionally approximated as {{mono|(P)}}.
; {{anchor|per cent}} %
: The per cent sign is conventionally substituted with {{mono|o/o}}.
; {{anchor|percent}} ‰
: The per mille sign is conventionally substituted with {{mono|o/oo}}.
; {{anchor|plus}} +
: If the straight apostrophe ({{code|'}}) is long enough, place two of them above each other combined with a dash ({{code|-}}).
: A makeshift plus is achieved by overlaying the dash ({{code|-}}) with a slash ({{code|/}}). This is more acceptable in combination with italic type faces.
; {{anchor|pound sign|pound sterling|£}} £
: The pound sign is substituted by an {{code|L}} overlaid with a dash ({{code|-}}). In some typefaces it may look like an {{code|E}} with its top bar missing, though.
: In some typefaces {{code|L}} overlaid by an {{code|f}} may be more appealing.
; {{anchor|CHARACTER-Q}} {{anchor|quotation marks}} quotation marks
: Virtually all typewriters lack proper quotation marks ({{abbr|AE|American English}}: “…”; {{abbr|BE|British English}}: ‘…’). The inch sign ({{code|"}}) or straight apostrophe ({{code|'}}) are used instead. Some languages use lowered quotation marks ({{lang|de|„Abc ‚def‘ ghi“|italic=unset}}): advancing by one half line works, but – beside being inconvenient – it may look just ugly, so the English quotations are used nonetheless.
; {{anchor|CHARACTER-R}} {{anchor|ℝ}} ℝ
: Hit and hold capital {{code|I}}, depress the space bar and release the {{code|I}} key, now type a capital {{code|R}}. However, on some typewriters the stems of {{code|I}} and {{code|R}} may be exactly on top of each other, so you type {{mono|IR}} with regular spacing instead. Note, for {{em|consistent}} style – if other similar characters such as ℚ are used in a document – consider writing this character manually.
; {{anchor|response}} ℟
: Hit and hold capital {{code|R}}, depress the space bar and release the {{code|R}} key, and now type a slash ({{code|/}}).
; {{anchor|CHARACTER-S}} {{anchor|semicolon|;}} ;
: A semicolon can be produced by overlaying the comma {{code|,}} and colon {{code|:}}. Type a comma, use the {{key press|backspace}}, and type the colon.
; {{anchor|root|square root|√}} √
: Advance the paper by half a line. Press and hold the {{key press|space}} key, type a {{code|v}}. After releasing all keys undo advancing the paper. Now type a {{code|/}}. The terms in the root are [[#overlining|overlined]].
; {{anchor|st}} st
: Combine {{code|s}} and {{code|t}} a half step apart.
; {{anchor|star}} ✶
: Something {{em|resembling}} a six‐pointed star is achieved by overprinting capital {{code|A}} with a {{code|v}}. See also [[#eight-spoked asterisk|eight‐spoked asterisk]].
; {{anchor|CHARACTER-T}} {{anchor|thorn|þ}} þ
: The stems may not align perfectly, but try overlaying {{code|b}} and {{code|p}}.
; {{anchor|CHARACTER-U}} {{anchor|unequal}} ≠
: Overlay [[#equal sign|{{code|1==}}]] with {{code|/}}.
; {{anchor|upward arrow from bar|↥}} ↥
: This is not necessarily suitable for all typefaces: Hit {{code|´}} and {{code|`}}; this is usually one “dead key”, that means it does not advance the carriage. Now type an ell ({{code|l}}).
; {{anchor|CHARACTER-Z}} {{anchor|ℤ}} ℤ
: Type overlapping {{code|Z}}’s.
; {{anchor|zero}} zero
: Many typewriters do not have a dedicated digit zero key. The zero is produced by typing a capital Oh instead. This allows the manufacturer to provide another character. For a slashed zero, see [[#∅︀|∅︀]].
If a character cannot be printed, you need to do it by hand.
In order to not accidentally miss any unprinted characters, there are small adhesive flags you can stick on the paper.
== standards ==
{{wikipedia|list of style guides}}
This section showcases standard‐compliant writing emphasizing the proper use of the typewriter.
{{editor note|This section can be extended: indictment, screenplay, academic essays, as long as it is (or was) formally standardized it fits.}}
{{wikibook|Professional and Technical Writing/Business Communications/Letters}}
=== DIN‐Norm 5008 business letter ===
Among writing instructions, the {{lang|de|{{abbr|DIN|Deutsches Institut für Normung}}‐Norm 5008|italic=unset}} (German Institute for Standardization Standard 5008) defines the page layout.
The page layout is tailored to a {{lang|de|{{abbr|DIN|Deutsches Institut für Normung}} A4|italic=unset}} sheet;
this is 210 {{abbr|mm|millimeters}} × 297 {{abbr|mm|millimeters}}.
There is one line reserved for a return address.
Because the line length is 75 {{abbr|mm|millimeters}}, printing a return address in practice necessitates a smaller [[#typeface|font]], hence it is {{em|not}} written {{em|with}} a typewriter.
At 6 {{abbr|lpi|lines per inch}} there are exactly two blank lines between the information and text frame.
Paragraphs are separated by one blank line.
The text width is 165 {{abbr|mm|millimeters}}
At 10 {{abbr|cpi|characters per inch}} you can fit 64.96 characters.
If you want to fold the letter, you have a {{em|purely esthetic<!-- alt. US spelling, see [[wikt:esthetic]] -->}} problem:
a fold across the text (and {{abbr|btw|by the way}} the signature) is ugly.
Folds are supposed to run {{em|between}} any two lines.
However, the middle segment of a folded {{lang|de|{{abbr|DIN|Deutsches Institut für Normung}}‐Norm 5008|italic=unset}} business letter page has a height of 105 mm.
At 6 {{abbr|lpi|lines per inch}} it is not possible to find a configuration ensuring the folds are {{em|between}} the lines.
Therefore, {{em|esthetically tolerable}} business letters conforming to {{lang|de|{{abbr|DIN|Deutsches Institut für Normung}}‐Norm 5008|italic=unset}} are {{em|only one page}} long.
To economize on space, only form A is presented.
; {{anchor|5008 Cella}} Robotron S 1001 Cella
:# [[Image: 20260128loremIpsumBusinessLetterFollowingDeutschesInstitutFuerNormungStandard5008typeAtypewrittenWithRobotronCella.png|thumb|alt=A sample text letter obeying to certain rules.|{{abbr|POC|proof of concept}}: A typewritten business letter.]] Set the [[#margins|margins]]. The left‐hand margin is set at 11, the right‐hand margin at 74. There is space for 64 characters.
:# Load the paper. The left‐hand edge should be at 0.5 characters on the paper bail. For that use the (white on black) margin ruler. The left‐hand edge should be at the 1 tick. Prefer to slightly cover the mark. Before disengaging the paper release, flip down the paper support and pull the paper to the back, away from you. Both ends of the paper should lay on top of each other.
:# Now scroll back the paper so its top edge {{em|is}} barely visible through the ridge in the typing mask. Possibly you need to repeat the previous step.
:# Advance so you have 7 blank lines. The cursor is now in the return address line. You have 29 character positions at your disposal. The next 9 lines are for the actual inside address.
:# Advance by one line. This line and the next two lines are meant for postal instructions. It is also the first line of the data frame. To get to the data frame, press {{key press|⇥}} four times and depress and hold the spacer. The cursor is at 49. Start typing from here up to 29 characters. The data frame consists of exactly 12 lines.
:# After the data frame leave (exactly) two blank lines. For the letter body you have 48 lines of vertical space left, the descenders{{noprint|1={{hover info|lines that extend below the baseline (the line characters “sit” on)}}}} of the 48{{sup|th}} line already being clipped if you can even manage to keep the paper in place. Avoid using the final 6 lines (1 ") just in general.
:# For the signature reserve (at least) three blank lines.
:# For right‐aligned double‐digit page numbering of the form {{mono|Page 12 of 34}}, press {{key press|⇥}} five times and {{key press|space}} three times. Press {{key press|space}} another two times for single‐digit page numbering.
== references ==
{{to do|{{em|Possibly}} generic references, data lookup tables.}}
== further reading ==
{{wikibook|Adventist Youth Honors Answer Book/Vocational/Typewriting}}
* {{PDFlink|[[:File: Practical typewriting - by the all-finger method, which leads to operation by touch (IA practicaltypewri00torr).pdf|Practical typewriting]]|12.26 {{abbr|MiB|mebibyte}}}}
* {{PDFlink|[[:File: New practical typewriting. (IA newpracticaltype00unse).pdf|New practical typewriting]]|16.38 {{abbr|MiB|mebibyte}}}}
* {{PDFlink|[[:File: A scientific course in typewriting (IA scientificcourse00depe).pdf|A scientific course in typewriting]]|5.1 {{abbr|MiB|mebibyte}}}}
<!--
== sources ==
<ref>
</ref>
-->
{{alphabetical}}
{{one-page book}}
{{shelves|trades}}<!-- “typist” as (virtually extinct) profession; irrelevant to secretaries nowadays -->
{{status|0%}}
{{subjects|communication|written communication}}
<!-- vim: set filetype=mediawiki: -->
9sj2e4tm5r0jspn5pnfq3p61pefpqp0
General Literary Chinese from Scratch/How Characters are Made
0
484050
4669630
4669533
2026-09-11T00:06:36Z
Shira the Mogul
3560559
4669630
wikitext
text/x-wiki
This lesson will teach you how Han characters are made.
So far, we have mostly focused on pictographic characters, those that are just heavily abstracted pictures of things that were important to the ancient Chinese people. However, there are only so many pictures that one can remember until it becomes unfeasible, right?
Let me introduce you to a text by the Heian ({{lang|zh|平安}}) poet, Kiyohara no Sanemoto ({{lang|zh|清原真友}}) of Japan. You are not required to understand what it means at this time. I want you to look at the characters themselves before reading on, for about 10 minutes.
<blockquote>
《字訓詩·清原真友》<br>
禾失曾知秩,中心豈忘忠。里魚穿浪鯉,江鳥度秋鴻。
火盡仍為燼,山高自作嵩。色絲辭不絕,凡虫泣寒風。
</blockquote>
Isn't there something strange about the character choices? Perhaps there is a method to it all.
Indeed, for each couplet, the first two characters form the fifth. The poem does in fact have meaning:
<blockquote>
The Poem on Character Interpretation<br>
The grain, though lost, still knows its order; its heart, though unwavering, never forgets loyalty. Fish dart through the waves like carp; river birds fly across in autumn like wild geese.
Even when the fire is extinguished, it remains as ashes; even when the mountain is high, it remains majestic like Mt. Song. The silken threads of life continue their farewell; even the common insects weep in the cold wind.
</blockquote>
So what we have learned here, just by gazing at that poem, is that each character is made from others. This is where the next two character categories come in: Phono-semantic compounds and ideogrammic compounds.
==Ideogrammic compounds==
Ideogrammic compounds ({{lang|zh|會意}} "joined ideas") consist of two semantic objects being placed together to form a new one. The first two compounds you learned in this book, {{lang|zh|林}} and {{lang|zh|森}}, are examples of this phenomenon. To give another example, ({{lang|zh|典}}) "law, classic, documentation" consists of books ({{lang|zh|冊}}) on a table ({{lang|zh|丌}}).
<gallery>
冊-bronze.svg
丌-bronze.svg
典-bronze.svg
</gallery>
Ideogrammic compounds are quite rare in Chinese literature, but become more common in Japanese literature. For example, {{lang|zh|働}} "to work" is formed from {{lang|zh|人}} "person" {{lang|zh|動}} "move".
If you put the sun ({{lang|zh|日}}) and moon ({{lang|zh|月}}) together to make ({{lang|zh|明}}, what do you think it could represent?
==Phono-semantic compounds==
Phono-semantic compounds ({{lang|zh|形聲}}) consist of one semantic character with another character next to it to serve as the sound. Most characters are formed through this method, making up around 80% of the Han script. Therefore, it is useful to learn a pronunciation with which to associate characters with sounds, even if it is not intended to be used productively.
Let's take ({{lang|zh|人}} and ({{lang|zh|山}} for a moment to make ({{lang|zh|仙}}.
<gallery>
人-bigseal-2.svg
山-bigseal.svg
File:ACC-L06562.svg
</gallery>
This gets across "a man on a mountain," though it is more abstract: It refers to an [[w:Xian (Taoism)|Daoist immortal]], which usually involves mountain symbolism. Mountain is pronounced ''shan'' in Mandarin Chinese, and this character would be pronounced ''xian'' (like shee-en). See the similarity? Oftentimes phono-semantic compounds try to be related, though this is not always the case. You can take these characters at face-value as if they were phonetic script, where the semantic characters are hints.
Think of it like this:
<blockquote>
👁️🌊👻
</blockquote>
Even though these are images, you know what this says. That is how these work, only we are using these pronunciations with a different thing. So imagine this...
<blockquote>
👁️🗑️[👁️🌪️]
</blockquote>
Eye bin "eye" - eye with a tornado next to it. So the eye of a typhoon? Yes - that is how these work, essentially. It resolves homophones. This is why so many characters end up like this.
Semantic components are usually of concrete meaning: horse {{lang|zh|馬}},mouse {{lang|zh|鼠}},and bird {{lang|zh|鳥}} will almost always have a phonetic component on the left, and usually be about a type of that animal. Given the aforementioned information, why do you think that is?
==Exercise==
Try looking at the characters you have learned so far from previous lessons, and try to categorise them using the categories you have already learned. I also recommend learning "difficult" ({{lang|zh|難}}) and "heavy" ({{lang|zh|重}}), which will be useful in future lessons.
==Cangjie codes==
* 平: 一火十 (MFJ)
* 安: 十女 (JV)
* 清: 水手一月 (EQMB)
* 原: 一竹日火 (MHAF)
* 真: 十月一金 (JBMC)
* 友: 大水 (KE)
* 字: 十弓木 (JND)
* 訓: 卜口中中中 (YRLLL)
* 詩: 卜口土木戈 (YRGDI)
* 禾: 竹木 (HD)
* 失: 竹手人 (HQO)
* 曾: 金田日 (CWA)
* 知: 人大口 (OKR)
* 秩: 竹木竹手人 (HDHQO)
* 豈: 山一口廿 (UMRT)
* 忘: 卜女心 (YVP)
* 忠: 中心 (LP)
* 里: 田土 (WG)
* 魚: 弓田火 (NWF)
* 穿: 十金一女竹 (JCMVH)
* 浪: 水戈日女 (EIAV)
* 鯉: 弓火田土 (NFWG)
* 江: 水一 (EM)
* 鳥: 竹日卜火 (HAYF)
* 度: 戈廿水 (ITE)
* 秋: 竹木火 (HDF)
* 鴻: 水一竹火 (EMHF)
* 盡: 中一火月廿 (LMFBT)
* 仍: 人弓竹尸 (ONHS)
* 為: 戈大弓火 (IKNF)
* 燼: 火中一廿 (FLMT)
* 高: 卜口月口 (YRBR)
* 自: 竹月山 (HBU)
* 作: 人竹尸 (OHS)
* 嵩: 山卜口月 (UYRB)
* 色: 弓日山 (NAU)
* 絲: 女火女戈火 (VFVIF)
* 辭: 月月卜廿十 (BBYTJ)
* 不: 一火 (MF)
* 絕: 女火尸竹山 (VFSHU)
* 凡: 竹弓戈 (HNI)
* 虫: 中一戈 (LMI)
* 泣: 水卜廿 (EYT)
* 寒: 十廿金卜 (JTCY)
* 風: 竹弓竹中戈 (HNHLI)
* 會: 人一田日 (OMWA)
* 意: 卜廿日心 (YTAP)
* 林: 木木 (DD)
* 森: 木木木 (DDD)
* 典: 廿月金 (TBC)
* 冊: 月廿 (BT)
* 丌: 一中 (ML)
* 働: 人竹土尸 (OHGS)
* 人: 人 (O)
* 動: 竹土大尸 (HGKS)
* 明: 日月 (AB)
* 形: 一廿竹竹竹 (MTHHH)
* 聲: 土水尸十 (GESJ)
* 仙: 人山 (OU)
* 馬: 尸手尸火 (SQSF)
* 鼠: 竹難女卜女 (HXVYV)
* 難: 廿人人土 (TOOG)
* 重: 竹十田土 (HJWG)
a8mhgg0aixanzzkhi1f4ruiwsmg6bzk
4669631
4669630
2026-09-11T00:07:41Z
Shira the Mogul
3560559
4669631
wikitext
text/x-wiki
This lesson will teach you how Han characters are made.
So far, we have mostly focused on pictographic characters, those that are just heavily abstracted pictures of things that were important to the ancient Chinese people. However, there are only so many pictures that one can remember until it becomes unfeasible, right?
Let me introduce you to a text by the Heian ({{lang|zh|平安}}) poet, Kiyohara no Sanemoto ({{lang|zh|清原真友}}) of Japan. You are not required to understand what it means at this time. I want you to look at the characters themselves before reading on, for about 10 minutes.
<blockquote>
《字訓詩·清原真友》<br>
禾失曾知秩,中心豈忘忠。里魚穿浪鯉,江鳥度秋鴻。
火盡仍為燼,山高自作嵩。色絲辭不絕,凡虫泣寒風。
</blockquote>
Isn't there something strange about the character choices? Perhaps there is a method to it all.
Indeed, for each couplet, the first two characters form the fifth. The poem does in fact have meaning:
<blockquote>
The Poem on Character Interpretation<br>
The grain, though lost, still knows its order; its heart, though unwavering, never forgets loyalty. Fish dart through the waves like carp; river birds fly across in autumn like wild geese.
Even when the fire is extinguished, it remains as ashes; even when the mountain is high, it remains majestic like Mt. Song. The silken threads of life continue their farewell; even the common insects weep in the cold wind.
</blockquote>
So what we have learned here, just by gazing at that poem, is that each character is made from others. This is where the next two character categories come in: Phono-semantic compounds and ideogrammic compounds.
==Ideogrammic compounds==
Ideogrammic compounds ({{lang|zh|會意}} "joined ideas") consist of two semantic objects being placed together to form a new one. The first two compounds you learned in this book, {{lang|zh|林}} and {{lang|zh|森}}, are examples of this phenomenon. To give another example, ({{lang|zh|典}}) "law, classic, documentation" consists of books ({{lang|zh|冊}}) on a table ({{lang|zh|丌}}).
<gallery>
冊-bronze.svg
丌-bronze.svg
典-bronze.svg
</gallery>
Ideogrammic compounds are quite rare in Chinese literature, but become more common in Japanese literature. For example, {{lang|zh|働}} "to work" is formed from {{lang|zh|人}} "person" {{lang|zh|動}} "move".
If you put the sun ({{lang|zh|日}}) and moon ({{lang|zh|月}}) together to make ({{lang|zh|明}}, what do you think it could represent?
==Phono-semantic compounds==
Phono-semantic compounds ({{lang|zh|形聲}}) consist of one semantic character with another character next to it to serve as the sound. Most characters are formed through this method, making up around 80% of the Han script. Therefore, it is useful to learn a pronunciation with which to associate characters with sounds, even if it is not intended to be used productively.
Let's take {{lang|zh|人}} and {{lang|zh|山}} for a moment to make {{lang|zh|仙}}.
<gallery>
人-bigseal-2.svg
山-bigseal.svg
File:ACC-L06562.svg
</gallery>
This gets across "a man on a mountain," though it is more abstract: It refers to an [[w:Xian (Taoism)|Daoist immortal]], which usually involves mountain symbolism. Mountain is pronounced ''shan'' in Mandarin Chinese, and this character would be pronounced ''xian'' (like shee-en). See the similarity? Oftentimes phono-semantic compounds try to be related, though this is not always the case. You can take these characters at face-value as if they were phonetic script, where the semantic characters are hints.
Think of it like this:
<blockquote>
👁️🌊👻
</blockquote>
Even though these are images, you know what this says. That is how these work, only we are using these pronunciations with a different thing. So imagine this...
<blockquote>
👁️🗑️[👁️🌪️]
</blockquote>
Eye bin "eye" - eye with a tornado next to it. So the eye of a typhoon? Yes - that is how these work, essentially. It resolves homophones. This is why so many characters end up like this.
Semantic components are usually of concrete meaning: horse {{lang|zh|馬}},mouse {{lang|zh|鼠}},and bird {{lang|zh|鳥}} will almost always have a phonetic component on the left, and usually be about a type of that animal. Given the aforementioned information, why do you think that is?
==Exercise==
Try looking at the characters you have learned so far from previous lessons, and try to categorise them using the categories you have already learned. I also recommend learning "difficult" ({{lang|zh|難}}) and "heavy" ({{lang|zh|重}}), which will be useful in future lessons.
==Cangjie codes==
* 平: 一火十 (MFJ)
* 安: 十女 (JV)
* 清: 水手一月 (EQMB)
* 原: 一竹日火 (MHAF)
* 真: 十月一金 (JBMC)
* 友: 大水 (KE)
* 字: 十弓木 (JND)
* 訓: 卜口中中中 (YRLLL)
* 詩: 卜口土木戈 (YRGDI)
* 禾: 竹木 (HD)
* 失: 竹手人 (HQO)
* 曾: 金田日 (CWA)
* 知: 人大口 (OKR)
* 秩: 竹木竹手人 (HDHQO)
* 豈: 山一口廿 (UMRT)
* 忘: 卜女心 (YVP)
* 忠: 中心 (LP)
* 里: 田土 (WG)
* 魚: 弓田火 (NWF)
* 穿: 十金一女竹 (JCMVH)
* 浪: 水戈日女 (EIAV)
* 鯉: 弓火田土 (NFWG)
* 江: 水一 (EM)
* 鳥: 竹日卜火 (HAYF)
* 度: 戈廿水 (ITE)
* 秋: 竹木火 (HDF)
* 鴻: 水一竹火 (EMHF)
* 盡: 中一火月廿 (LMFBT)
* 仍: 人弓竹尸 (ONHS)
* 為: 戈大弓火 (IKNF)
* 燼: 火中一廿 (FLMT)
* 高: 卜口月口 (YRBR)
* 自: 竹月山 (HBU)
* 作: 人竹尸 (OHS)
* 嵩: 山卜口月 (UYRB)
* 色: 弓日山 (NAU)
* 絲: 女火女戈火 (VFVIF)
* 辭: 月月卜廿十 (BBYTJ)
* 不: 一火 (MF)
* 絕: 女火尸竹山 (VFSHU)
* 凡: 竹弓戈 (HNI)
* 虫: 中一戈 (LMI)
* 泣: 水卜廿 (EYT)
* 寒: 十廿金卜 (JTCY)
* 風: 竹弓竹中戈 (HNHLI)
* 會: 人一田日 (OMWA)
* 意: 卜廿日心 (YTAP)
* 林: 木木 (DD)
* 森: 木木木 (DDD)
* 典: 廿月金 (TBC)
* 冊: 月廿 (BT)
* 丌: 一中 (ML)
* 働: 人竹土尸 (OHGS)
* 人: 人 (O)
* 動: 竹土大尸 (HGKS)
* 明: 日月 (AB)
* 形: 一廿竹竹竹 (MTHHH)
* 聲: 土水尸十 (GESJ)
* 仙: 人山 (OU)
* 馬: 尸手尸火 (SQSF)
* 鼠: 竹難女卜女 (HXVYV)
* 難: 廿人人土 (TOOG)
* 重: 竹十田土 (HJWG)
m4n230gcz28n76skr6p5gx58bd9fsrq
Wikibooks:Reading room/Administrative Assistance/Archives/2026/August
4
485284
4669645
4669505
2026-09-11T08:10:49Z
ArchiverBot
1227662
Bot: Archiving 1 thread from [[Wikibooks:Reading room/Administrative Assistance]]
4669645
wikitext
text/x-wiki
{{talk archive}}
== Permata55 reported by MathXplore ==
* {{userlinks|Permata55}}
Spam <!-- USERREPORTED:/Permata55/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 07:33, 1 August 2026 (UTC)
: Already globally locked by a steward. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 20:23, 2 August 2026 (UTC)
== Birdsjungle reported by MathXplore ==
* {{userlinks|Birdsjungle}}
Link spam, [[Special:AbuseLog/314940]] <!-- USERREPORTED:/Birdsjungle/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 11:21, 3 August 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 14:02, 3 August 2026 (UTC)
== Uniquehairgro reported by MathXplore ==
* {{userlinks|Uniquehairgro}}
Spam <!-- USERREPORTED:/Uniquehairgro/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:37, 4 August 2026 (UTC)
:{{done}} —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:46, 4 August 2026 (UTC)
== Jerinjebin reported by MathXplore ==
* {{userlinks|Jerinjebin}}
Link spam, [[Special:AbuseLog/314965]] <!-- USERREPORTED:/Jerinjebin/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:38, 5 August 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 15:39, 5 August 2026 (UTC)
== Nokiya23 reported by MathXplore ==
* {{userlinks|Nokiya23}}
Link spam, [[Special:AbuseLog/315040]] <!-- USERREPORTED:/Nokiya23/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 11:36, 7 August 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 17:51, 7 August 2026 (UTC)
== Requesting temporary clearance to edit protected (content) namespace and template pages. ==
In order to continue to reduce the LintErrors, I'm requesting the temporary ability to edit protected pages in content and template namespaces.
I am requesting to do this under supervision of an adminstrator here, so a mentor experinced administrator is desirable.
A number of the remaining Lint issues concern specfic templates, which could have a considerable impact if the lint issues are resolved.<br> [[User:ShakespeareFan00|ShakespeareFan00]] ([[User talk:ShakespeareFan00|discuss]] • [[Special:Contributions/ShakespeareFan00|contribs]]) 18:26, 13 August 2026 (UTC)
: [[User:ShakespeareFan00|ShakespeareFan00]], in accordance with [[Wikibooks:Administrators#Temporary administrators]], please file a request at [[Wikibooks:Requests for permissions]]. State your reasons for requesting temporary adminship (such as the above), and please be aware that using the administrator permission for any admin action other than your stated task(s) may result in immediate removal by a steward. It will only be granted for the shortest duration as needed, so you may also want to state what time your permission should last as well. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 18:31, 13 August 2026 (UTC)
: @[[User:ShakespeareFan00|ShakespeareFan00]]—second ping. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 12:46, 14 August 2026 (UTC)
:: Noted, It seems I might not need this after all. I seem to be making good progress as it is :) [[User:ShakespeareFan00|ShakespeareFan00]] ([[User talk:ShakespeareFan00|discuss]] • [[Special:Contributions/ShakespeareFan00|contribs]]) 14:36, 14 August 2026 (UTC)
== Flossandglosskidsdentistry reported by MathXplore ==
* {{userlinks|Flossandglosskidsdentistry}}
Spam <!-- USERREPORTED:/Flossandglosskidsdentistry/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:50, 18 August 2026 (UTC)
:Seems to be globally locked! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 17:22, 18 August 2026 (UTC)
== Solosfit reported by MathXplore ==
* {{userlinks|Solosfit}}
Spam <!-- USERREPORTED:/Solosfit/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:51, 18 August 2026 (UTC)
:Seems to be globally locked. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 17:22, 18 August 2026 (UTC)
== Mapcontechnologies reported by MathXplore ==
* {{userlinks|Mapcontechnologies}}
Spam <!-- USERREPORTED:/Mapcontechnologies/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:51, 18 August 2026 (UTC)
:Seems to be globally locked. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 17:23, 18 August 2026 (UTC)
== IntoAEC reported by MathXplore ==
* {{userlinks|IntoAEC}}
Spam <!-- USERREPORTED:/IntoAEC/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:25, 19 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:27, 26 August 2026 (UTC)
== CaribbeanMedicalSchools reported by MathXplore ==
* {{userlinks|CaribbeanMedicalSchools}}
Spam <!-- USERREPORTED:/CaribbeanMedicalSchools/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:16, 26 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:27, 26 August 2026 (UTC)
== Chzoraiz41 reported by MathXplore ==
* {{userlinks|Chzoraiz41}}
Link spam, [[Special:AbuseLog/315229]] <!-- USERREPORTED:/Chzoraiz41/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:09, 27 August 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 12:17, 27 August 2026 (UTC)
jrm2ljlhou4uwjjz7epyqmrqj1vypgv
Maxima/Programming
0
485506
4669603
4669498
2026-09-10T14:27:01Z
Idavidmiller
3577687
Work in progress. Saving Changes.
4669603
wikitext
text/x-wiki
=Maxima Programming=
Although Maxima is not a general-purpose programming language, Maxima as a CAS includes among the built-in ingredients a relatively complete set of programming expressions that are useful for the intended context. Many of the code examples of this section are intended to be illustrative of technical details relevant to Maxima programming as their purpose, and consequently are intentionally elementary in character.
Learning any sort of programming language, including Maxima programming expressions, is a subjective process. In any case, it is essential to have enough technical know-how specific to the programming language in order to begin the learning process, even in cases where much positive transfer from other programming experience is involved.
Much can be accomplished mathematically using Maxima without having to resort to in-depth knowledge and proficiency in the technical details of Maxima programming expressions. However, Maxima programming expressions are frequently essential for the purpose of defining functions, both in the programming sense of the term, but also more relevantly, to the mathematical sense. For that reason alone, familiarity and sufficient proficiency with Maxima programming expressions should be given some attention.
The following table shows some built-in ingredients related to Maxima programming expressions:
{| class="wikitable"
|+Maxima Programming Category
|if
|unless
|errcatch
|prederror
|-
|block
|for
|error
|return
|-
|catch
|from
|warning
|throw
|-
|local
|thru
|errormsg
|sstatus
|-
|garbage_collect
|step
|errormsg
|status
|-
|do
|next
|go
|
|-
|while
|in
|
|
|}
Some of these programming expression ingredients can also be considered as belonging to one or more other categories than the Programming category.
=== Block Expressions ===
Arguably, the first expressions to consider in the context of Maxima programming are '''''block''''' expressions. Block expressions as programming ingredients come in two flavors:
* <code>( expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub> )</code>
* <code>block ([v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>], expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code>
The first form of a block expression is equivalent to the second form, but without the first list argument: <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code>, as in <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code>, unless <code>return</code> or <code>go</code> are used in the block expression. In that, case the form <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code> must be used.
The purpose of the list argument, <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code> is to declare the values of identifiers of the list to be local to the <code>block</code>. If there is no need for local identifiers, the list argument can be omitted, unless <code>return</code> or <code>go</code> are used in the <code>block</code> expression, and either form is sufficient.<syntaxhighlight lang="maxima">/* This block expression */
(%i1) (x : 2, x^2);
(%o1) 4
/* Is equivalent to this block expression */
(%i2) block (x : 2, x^2);
(%o2) 4</syntaxhighlight>So, in the case where values of identifiers local to the <code>block</code> of expressions are not required, then the choice of either form of the <code>block</code> expression is a matter of user preference, . In both cases, the values of identifiers referenced in the <code>block</code> are global, and not local to the <code>block</code>.<syntaxhighlight lang="maxima">
/* The value 3 assigned to x is global */
(%i3) x : 3;
(x) 3
/* The value 2 assigned to x in the block is global */
(%i4) (x : 2, x^2);
(%o4) 4
/* The global value assigned to x in the block is 2 not 3 */
(%i5) x;
(%o5) 2
</syntaxhighlight>Values of identifiers local to the <code>block</code> may not be global:<syntaxhighlight lang="maxima">/* the value of identifier y is local only */
(%i6) block ([y], y : 4, y);
(%o6) 4
/* the global value of identifier y is not 4, but is itself */
(%i7) y;
(%o7) y
/* the values of identifiers x and y are both local */
(%i8) block ([x,y], x : 3, y : 4, x);
(%o8) 3
/* the global value of identifier x is not 3, but is 2 */
(%i9) x;
(%o9) 2
/* the global value of identifier y is not 4, but is itself */
(%i10) y;
(%o10) y</syntaxhighlight>
Regardless of the form of the <code>block</code> expressions these have in common the comma-separated expression arguments <code>expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code> which are evaluated each in turn from first to last (unless the evaluation sequence is modified by by the <code>go</code>, <code>throw</code>, or <code>return</code> operators), and the value of the block expression is the value of <code>expr<sub>n</sub></code>.
The main purpose of the <code>block</code> expression, regardless of the form, it to group expressions that are related in some manner, and the value of the last expression may be the only value of interest. However, there are very few limitations imposed on the nature of the <code>block</code> expression arguments, so it might be the case that the purpose of evaluating the <code>block</code> expression has been achieved before the last expression argument is evaluated, in which case the value of the <code>block</code> expression may not necessarily be the value of the last argument expression.
One way to accomplish that is to use an empty string as the last argument expression with the option flag <code>stringdisp</code>set to <code>false</code> which is the default value.<syntaxhighlight lang="maxima">
(%i11) stringdisp;
(%o11) false
(%i12) block ([x,y], x : 3, y : 4, x, "");
(%o12)
(%i13) block ([x,y], x : 3, y : 4, x)$
</syntaxhighlight>
The display of the value of the <code>block</code> expression may be suppressed using a <code>$</code> to end the input expression instead of a semi-colon. Either technique produces a <code>block</code> expression value, but the value is not displayed. If a <code>return</code> operator is evaluated as a argument expression, this will cause evaluation of expression arguments to end explicitly, and the value of the <code>return</code> operator becomes the value of the <code>block</code> expression.<syntaxhighlight lang="maxima">
(%i14) is (x = 2)
(%o14) true
%i15) block (if is(x = 2) then return (x), " x not 2");
(%o15) 2
(%i16) x : 3;
(x) 3
(%i17) block (if is (x = 2) then return (x), "x not 2");
(%o17) x not 2
</syntaxhighlight>
=== Functions ===
=== Lisp and Maxima ===
{{BookCat}}
nglocmf9yfq96cjzw6ff8bw4q7dtovl
4669638
4669603
2026-09-11T02:06:47Z
Idavidmiller
3577687
Work in progress. Saving Changes.
4669638
wikitext
text/x-wiki
=Maxima Programming=
Although Maxima is not a general-purpose programming language, Maxima as a CAS includes among the built-in ingredients a relatively complete set of programming expressions that are useful for the intended context. Many of the code examples of this section are intended to be illustrative of technical details relevant to Maxima programming as their purpose, and consequently are intentionally elementary in character.
Learning any sort of programming language, including Maxima programming expressions, is a subjective process. In any case, it is essential to have enough technical know-how specific to the programming language in order to begin the learning process, even in cases where much positive transfer from other programming experience is involved.
Much can be accomplished mathematically using Maxima without having to resort to in-depth knowledge and proficiency in the technical details of Maxima programming expressions. However, Maxima programming expressions are frequently essential for the purpose of defining functions, both in the programming sense of the term, but also more relevantly, to the mathematical sense. For that reason alone, familiarity and sufficient proficiency with Maxima programming expressions should be given some attention.
One way to begin the learning process is to become familiar with enough of the programming essentials to accomplish independent efforts toward accomplishing some specific programming goal of interest. The other way is to study the many available programming expressions of others. This section is intended to provide the essentials toward learning by whatever means is chosen.
The following table shows some built-in ingredients related to Maxima programming expressions:
{| class="wikitable"
|+Maxima Programming Category
|if
|unless
|errcatch
|prederror
|-
|block
|for
|error
|return
|-
|catch
|from
|warning
|throw
|-
|local
|thru
|errormsg
|sstatus
|-
|garbage_collect
|step
|errormsg
|status
|-
|do
|next
|go
|
|-
|while
|in
|
|
|}
Some of these programming expression ingredients can also be considered as belonging to one or more other categories than the Programming category.
=== Block Expressions ===
Arguably, the first expressions to consider in the context of Maxima programming are '''''block''''' expressions. Block expressions as programming ingredients come in two flavors:
* <code>( expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub> )</code>
* <code>block ([v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>], expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code>
The first form of a block expression is equivalent to the second form, but without the first list argument: <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code>, as in <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code>, unless <code>return</code> or <code>go</code> are used in the block expression. In that, case the form <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code> must be used.
The purpose of the list argument, <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code> is to declare the values of identifiers of the list to be local to the <code>block</code>. If there is no need for local identifiers, the list argument can be omitted, unless <code>return</code> or <code>go</code> are used in the <code>block</code> expression, and either form is sufficient.<syntaxhighlight lang="maxima">/* This block expression */
(%i1) (x : 2, x^2);
(%o1) 4
/* Is equivalent to this block expression */
(%i2) block (x : 2, x^2);
(%o2) 4</syntaxhighlight>So, in the case where values of identifiers local to the <code>block</code> of expressions are not required, then the choice of either form of the <code>block</code> expression is a matter of user preference, . In both cases, the values of identifiers referenced in the <code>block</code> are global, and not local to the <code>block</code>.<syntaxhighlight lang="maxima">
/* The value 3 assigned to x is global */
(%i3) x : 3;
(x) 3
/* The value 2 assigned to x in the block is global */
(%i4) (x : 2, x^2);
(%o4) 4
/* The global value assigned to x in the block is 2 not 3 */
(%i5) x;
(%o5) 2
</syntaxhighlight>Values of identifiers local to the <code>block</code> may not be global:<syntaxhighlight lang="maxima">/* the value of identifier y is local only */
(%i6) block ([y], y : 4, y);
(%o6) 4
/* the global value of identifier y is not 4, but is itself */
(%i7) y;
(%o7) y
/* the values of identifiers x and y are both local */
(%i8) block ([x,y], x : 3, y : 4, x);
(%o8) 3
/* the global value of identifier x is not 3, but is 2 */
(%i9) x;
(%o9) 2
/* the global value of identifier y is not 4, but is itself */
(%i10) y;
(%o10) y</syntaxhighlight>
Regardless of the form of the <code>block</code> expressions these have in common the comma-separated expression arguments <code>expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code> which are evaluated each in turn from first to last (unless the evaluation sequence is modified by by the <code>go</code>, <code>throw</code>, or <code>return</code> operators), and the value of the block expression is the value of <code>expr<sub>n</sub></code>.
The main purpose of the <code>block</code> expression, regardless of the form, it to group expressions that are related in some manner, and the value of the last expression may be the only value of interest. However, there are very few limitations imposed on the nature of the <code>block</code> expression arguments, so it might be the case that the purpose of evaluating the <code>block</code> expression has been achieved before the last expression argument is evaluated, in which case the value of the <code>block</code> expression may not necessarily be the value of the last argument expression.
One way to accomplish that is to use an empty string as the last argument expression with the option flag <code>stringdisp</code>set to <code>false</code> which is the default value.<syntaxhighlight lang="maxima">
(%i11) stringdisp;
(%o11) false
(%i12) block ([x,y], x : 3, y : 4, x, "");
(%o12)
(%i13) block ([x,y], x : 3, y : 4, x)$
</syntaxhighlight>
The display of the value of the <code>block</code> expression may be suppressed using a <code>$</code> to end the input expression instead of a semi-colon. Either technique produces a <code>block</code> expression value, but the value is not displayed. If a <code>return</code> operator is evaluated as a argument expression, this will cause evaluation of expression arguments to end explicitly, and the value of the <code>return</code> operator becomes the value of the <code>block</code> expression.<syntaxhighlight lang="maxima">
(%i14) is (x = 2)
(%o14) true
%i15) block (if is(x = 2) then return (x), " x not 2");
(%o15) 2
(%i16) x : 3;
(x) 3
(%i17) block (if is (x = 2) then return (x), "x not 2");
(%o17) x not 2
</syntaxhighlight>
=== Functions ===
=== Lisp and Maxima ===
{{BookCat}}
os9p43je5k2fjg8wm1fty1pifxh5ioi
Wikibooks:Reading room/Archives/2026/July
4
485508
4669643
4669503
2026-09-11T08:10:29Z
ArchiverBot
1227662
Bot: Archiving 1 thread from [[Wikibooks:Reading room/General]]
4669643
wikitext
text/x-wiki
{{talk archive}}
== A question about the user right move-subpages ==
Even though reviewers have the ability to move 100 pages per minute (per InitialiseSettings.php), they do not have <code>move-subpages</code>, which allows moving a book (with all its subpages) in one single action. Is this user right considered sensitive (hence it is restricted to administrators by default)? [[User:Codename Noreste|<span style="color:#0024FF">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 04:23, 9 July 2026 (UTC)
:I'm not 100% sure what the problem is as long as mass moving is limited to admins in the first place, as this can really cause problems (I recently encountered this mass-moving 100 out of c. 260 pages on a wiki). I support filing a ticket at [[:phab:]] to extend [[:mw:Manual:$wgMaximumMovedPages|$wgMaximumMovedPages]] to 1,000. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 05:33, 9 July 2026 (UTC)
== Viewing unreviewed changes, and recent changes, for a particular book ==
I've recently started editing [[Chess Opening Theory]] after a long hiatus. Two things
* How can I view recent edits, for this book alone. I'm aware of [[Using_Wikibooks/How_To_Edit_A_Wikibook#Watching All Pages in a Book|Watching All Pages in a Book]], which was well hidden on the page on editing, rather than on tracking changes (since rectified), but the advice there is unhelpful. Option 1 is entirely impractical, as one cannot add hundreds of pages one does not know about, and Option 2 simply doesn't work. For example, at this moment, there are 12 relevant edits listed in the main [[Special:RecentChanges]] page (which goes back to 9 July), but the suggested [https://en.wikibooks.org/wiki/Special:RecentChangesLinked/Chess_Opening_Theory Related Changes] only lists pages directly linked from the top level.
* Similarly, how can one see the unreviewed changes for this book (or even all the books, where I can at least manually filter). I noticed a whole lot going back more than a month and approved most of them, but this was only through some tedious digging around through user contributions and page histories.
**Partially answering this question myself, there's [https://en.wikibooks.org/w/index.php?title=Special%3APendingChanges&namespace=&tagFilter=&limit=50&category=&size= this page]. Which brings up a followup question. My contributions page doesn't list the changes I've approved (only the one I declined). Is there a way to see these? [[User:Greenman|Greenman]] ([[User talk:Greenman|discuss]] • [[Special:Contributions/Greenman|contribs]]) 21:38, 13 July 2026 (UTC)
Thanks! [[User:Greenman|Greenman]] ([[User talk:Greenman|discuss]] • [[Special:Contributions/Greenman|contribs]]) 21:29, 13 July 2026 (UTC)
:At the risk of sounding pedantic, a hack for the first problem whereby [[Special:RecentChangesLinked/Chess_Opening_Theory]] only shows changes that are linked to the top page of the book directly and not all sub-pages or sub-sub-sub-pages, etc. is to just make them all linked from the top page. This can be done with a template that may make it a little more pretty or discreet than a huge list of links. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 00:53, 14 July 2026 (UTC)
::Thanks, but this doesn't really help. Besides having to add thousands of links to the front page, which certainly shouldn't be displayed there, when someone adds a new variation (which is what a large portion of the edits are), the new entry won't appear on Recent Changes until specifically linked from the front page. [[User:Greenman|Greenman]] ([[User talk:Greenman|discuss]] • [[Special:Contributions/Greenman|contribs]]) 17:23, 15 July 2026 (UTC)
:@[[User:Greenman|Greenman]] I think using the book categories at [[Special:UnreviewedPages]] might be helpful here—is [https://en.wikibooks.org/w/index.php?title=Special%3AUnreviewedPages&namespace=0&category=Book%3AChess+Opening+Theory this] approximately what you're looking for? —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:24, 16 July 2026 (UTC)
::@[[User:Greenman|Greenman]] I think you're also looking for [[Special:Log/review]]. Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:32, 16 July 2026 (UTC)
:::Thanks, those are helpful. [[User:Greenman|Greenman]] ([[User talk:Greenman|discuss]] • [[Special:Contributions/Greenman|contribs]]) 15:04, 18 July 2026 (UTC)
== Citing WikiBooks? ==
Wikipedia has a page for Citing Wikipedia, but I haven't found one here, so I have a few questions:
# How would I cite Wikibooks in an essay?
# Do I need to cite sources on Wikibooks? If so, how?
[[User:BlazeFlames|BlazeFlames]] ([[User talk:BlazeFlames|discuss]] • [[Special:Contributions/BlazeFlames|contribs]]) 22:48, 18 June 2026 (UTC)
:# This should give you a good method: https://www.scribbr.com/citing-sources/how-to-cite-wikipedia/
:# Generally, no. We have [[Wikibooks:Policies and guidelines|no policy that requires or prohibits citing sources]] and we have a [[Help:Editing#References|help page on how to do it]], with a [[Wikibooks:Templates/Sources|number of templates]] to standardize the process. There is definitely value in citing sources, so I don't want to discourage it.
:―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 09:10, 19 June 2026 (UTC)
:: {{re|BlazeFlames}} As you can see in [[Special: Version#mw-version-ext|Special: Version § Installed Extensions]] this MediaWiki has the [[mw: Special: MyLanguage/Extension: CiteThisPage|CiteThisPage extension]] installed. On the English‑language edition of Wikibooks you can navigate to [[Special: CiteThisPage/Typewriting|Special: CiteThisPage/…]] even though it is not listed in the [[MediaWiki: Sidebar]] (but it’s listed in [[Special: SpecialPages#mw-specialpagesgroup-pagetools|Special: SpecialPages]]). However, on {{abbr|WB|Wikibooks}} I would link via the [[mw: Special: MyLanguage/Help: Page ID|page ID]] rather than the page title; replace <syntaxhighlight lang='text' inline>title=Booktitle</syntaxhighlight> with <syntaxhighlight lang='text' inline>curid=123456</syntaxhighlight>. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 15:09, 10 July 2026 (UTC)
== Images lost in Engineering Acoustics ==
Hello,
I just made an updated PDF version of the wiki book on Engineering Acoustics.
During this processes I realized that 19 Images are missing. I left the respective chapters out of the PDF version. You can find the missing files by opening https://en.wikibooks.org/wiki/Engineering_Acoustics/Print_version in your web browser and search for the text File: . I am not sure why they were deleted. But possibly they were moved to Wikimedia Commons first and deleted after that. I could try to restore the from the 16 years old PDF version but I lack any authorship information so I think we need to redraw all of them. Furthermore I realized that some of the rest of the images in the wiki book have got a very poor resolution
Yours 18:22, 18 June 2026 (UTC) [[User:Dirk Hünniger|Dirk Hünniger]] ([[User talk:Dirk Hünniger|discuss]] • [[Special:Contributions/Dirk Hünniger|contribs]]) 18:22, 18 June 2026 (UTC)
: {{re|Dirk Hünniger}} All media ([[:File: Acousticplanewave1.gif|A]][[:File: Acousticcontrolsurface.gif|B]][[:File: Acousticcontrolsurface.gif|C]][[:File: Acousticpressure1.gif|D]][[:File: Ra analogs.png|E]][[:File: Acoustic gen.png|F]][[:File: Enclosed Piston.png|G]][[:File: Equ1.jpg|H]][[:File: Equ3.gif|I]][[:File: Equ4.gif|K]][[:File: Comp.gif|L]][[:File: Example2holm1sol.JPG|M]][[:File: Exam2prob.JPG|N]][[:File: Exam2sol.JPG|O]][[:File: 1Dwave graph1.png|P]][[:File: String dwg.jpg|Q]][[:File: Equations1.jpg|R]][[:File: Equations2.jpg|S]]) except [[:File: Inductive law pass filter.jpg|Inductive law pass filter.jpg]] and [[:File: Open-twister.gif|Open-twister.gif]] were once deleted by [[User: Jguk|Jguk]] and [[User: Darklama|Darklame]] because after a grace period they still lacked copyright information. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 14:51, 10 July 2026 (UTC)
::@[[User:Kai Burghardt|Kai Burghardt]]
::Do we also need to delete the PDF then? It contains theses images.
::Yours [[User:Dirk Hünniger|Dirk Hünniger]] ([[User talk:Dirk Hünniger|discuss]] • [[Special:Contributions/Dirk Hünniger|contribs]]) 07:49, 11 July 2026 (UTC)
::: {{re|Dirk Hünniger}} It depends on the images’ contents, whether they’re copyrightable. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 08:40, 11 July 2026 (UTC)
::::@[[User:Kai Burghardt|Kai Burghardt]] Well to me the look copyrightable. And further more its just the same images that were deleted from the wiki due to copyright issues [[User:Dirk Hünniger|Dirk Hünniger]] ([[User talk:Dirk Hünniger|discuss]] • [[Special:Contributions/Dirk Hünniger|contribs]]) 13:33, 11 July 2026 (UTC)
::::: {{re|Dirk Hünniger}} As far as I understand the issue was a formality. All files must bear license info, regardless whether they’re copyrightable or not. It is quite possible all deleted images don’t meet the threshold of originality, but still were deleted because of this formality. Images like [[:File: Equ1.jpg|File: Equ1.jpg]] ''presumably'' contain ''just'' some rasterized text formula and as such are not copyrightable. I have not had a look at them, so I can’t tell. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 14:30, 11 July 2026 (UTC)
:::::: @[[User:Kai Burghardt|Kai Burghardt]] If its just a formality and the images don't meet the threshold to be copyrightable we could just restore the deleted images from the PDF. But keeping the PDF and not restoring the images surely is a contradiction. Furthermore there are quite a lot of books with the same problem. [[User:Dirk Hünniger|Dirk Hünniger]] ([[User talk:Dirk Hünniger|discuss]] • [[Special:Contributions/Dirk Hünniger|contribs]]) 17:25, 11 July 2026 (UTC)
== July 2026 Wikimedia Café meetups regarding Wikimedia governance and options for reform ==
<div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)">
<div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div>
Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in July. Both sessions will focus on Wikimedia governance, including possible follow-ups to the [https://meta.wikimedia.org/wiki/Movement_Charter Movement Charter] and options for reform. Participants may attend either or both Café sessions.
This month, to deconflict the Café meetups from Wikimania, the meetups will be held one day later than usual.
#'''26 July 2026 15:00 UTC''' ([https://zonestamp.toolforge.org/1785078000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe
#'''27 July 2026 03:00 UTC''' ([https://zonestamp.toolforge.org/1785121200 timestamp converter]), at a time friendly to Asia and the Pacific
Please see the Café page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]!
<br />
[[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div>
<span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">↠Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 03:53, 13 July 2026 (UTC)
so1y2bob6ft94jihnzixpdi0d2j7ufa
A-level Computing AQA Paper 1 Skeleton program 2027
0
485519
4669632
4669516
2026-09-11T01:00:43Z
JackBot
396820
Formatting, [[Special:UncategorizedPages]]
4669632
wikitext
text/x-wiki
This is for the 2027 AQA A-level Computer Science Specification (7517).
This is where suggestions can be made about what some of the questions might be and how we can solve them.
'''Please be respectful and do not vandalise the page, as this may affect students' preparation for exams!'''
{{shelves}}
mubvw16yhlewdxczuw98860biek5oey
User talk:Thenaoriudaipur
3
485554
4669564
2026-09-10T12:46:59Z
MathXplore
3097823
Notifying author of speedy deletion nomination
4669564
wikitext
text/x-wiki
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:User:Thenaoriudaipur]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[User talk:Thenaoriudaipur|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:46, 10 September 2026 (UTC)
q6w5h2iqatzycqq64zq0qlxr15t3bnn
User talk:Networkkingss
3
485555
4669571
2026-09-10T12:49:25Z
MathXplore
3097823
Notifying author of speedy deletion nomination
4669571
wikitext
text/x-wiki
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:How CCNA and CCNP Certifications Can Help Advance Your Networking Career]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[Talk:How CCNA and CCNP Certifications Can Help Advance Your Networking Career|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:49, 10 September 2026 (UTC)
pwq8kgzhygmrdpwp4q82nk5569cvh9z
4669573
4669571
2026-09-10T12:49:39Z
MathXplore
3097823
Notifying author of speedy deletion nomination
4669573
wikitext
text/x-wiki
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:How CCNA and CCNP Certifications Can Help Advance Your Networking Career]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[Talk:How CCNA and CCNP Certifications Can Help Advance Your Networking Career|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:49, 10 September 2026 (UTC)
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:Talk:Ccna-course]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[Talk:Ccna-course|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:49, 10 September 2026 (UTC)
7xnj1lvyxtohour58asm8megim4gsvs
User talk:~2026-48940-54
3
485556
4669580
2026-09-10T12:54:41Z
MathXplore
3097823
Warning user with {{Test1}}
4669580
wikitext
text/x-wiki
== September 2026 ==
{{tmbox|type=notice|text='''Please, can you [[Using Wikibooks|help]] improve [[WB:WIW|Wikibooks]]''' by [[Special:Contributions/~2026-48940-54|doing future experiments]] with the [[Help:Contents|wiki software]] in the [{{fullurl:Wikibooks:Sandbox|action=edit}} sandbox] instead? Your fellow contributors consider test edits in the sandbox constructive. You can ask questions or ask for help in the [[WB:HELP|Assistance Reading Room]].<br /> Thanks. }}
[[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:54, 10 September 2026 (UTC)
i72m9d4j4b4cx1v48fc4xv1d5zt7u0j
Modification de anna delvey wikipedia
0
485557
4669629
2026-09-10T23:26:05Z
~2026-49281-08
3625662
Created page with "tio work sit dowN talk come tomorrow mommy Girl friend Doctor work sit dowN tonight come talk help Room Evy sleep hold hand Rest Bed pain Neet Anna Delvey Doctor work"
4669629
wikitext
text/x-wiki
tio work sit dowN talk come tomorrow mommy Girl friend Doctor work sit dowN tonight come talk help
Room Evy sleep hold hand Rest Bed pain Neet Anna Delvey Doctor work
n2wmtm10gpdhfq0ao1l3uxyp1d26f9i