docs(amiga): complete AmigaOS 3.1/3.2 developer reference — 172 files across 17 sections

Comprehensive technical documentation covering:
- Hardware: OCS/ECS/AGA custom chip registers, Copper & Blitter deep dives
- Boot sequence: cold boot through startup-sequence
- Binary format: HUNK executable spec, relocation, debug info
- Linking & ABI: .fd files, LVO tables, register calling conventions
- Exec kernel: tasks, interrupts, memory, signals, semaphores
- AmigaDOS: file I/O, FFS/OFS layout, CLI/Shell scripting
- Graphics: planar bitmaps, Copper programming, HAM/EHB modes
- Intuition: screens, windows, IDCMP, BOOPSI
- Devices: trackdisk, SCSI, serial, timer, audio, keyboard
- Libraries: utility, expansion, IFFParse, locale, ARexx
- Networking: bsdsocket API, SANA-II, TCP/IP stack comparison
- Toolchain: GCC, vasm/vlink, SAS/C, NDK, debugging
- Reverse engineering: IDA/Ghidra setup, compiler fingerprints, case studies
- CPU & MMU: 68040/060 emulation libs, PMMU, cache management
- Driver development: SANA-II, Picasso96/RTG, AHI audio

All files include breadcrumb navigation. No local paths or proprietary content.
This commit is contained in:
Ilia Sharin 2026-04-23 12:16:52 -04:00
parent f07a368bf1
commit 21751c0025
172 changed files with 19701 additions and 0 deletions

View file

@ -0,0 +1,194 @@
[← Home](../README.md) · [Driver Development](README.md)
# Writing Picasso96/RTG Display Drivers
## Overview
**RTG** (Retargetable Graphics) allows the Amiga to use non-native display hardware (graphics cards). The two major RTG systems are **Picasso96** and **CyberGraphX**. Both use a board driver model where a `.card` file provides hardware-specific acceleration.
---
## Architecture
```
Application
↓ graphics.library / cybergraphics.library / Picasso96API
RTG System (P96 or CGX)
↓ Calls board driver functions
Board Driver (.card file)
↓ Programs hardware registers
Graphics Card Hardware (Cirrus, S3, Permedia, FPGA framebuffer...)
```
---
## Picasso96 Board Driver Interface
A P96 board driver is a shared library exposing specific functions:
### Required Functions
| Function | Description |
|---|---|
| `FindCard(boardInfo)` | Detect and identify the graphics card |
| `InitCard(boardInfo)` | Initialise card, set up memory map |
| `SetSwitch(boardInfo, state)` | Switch between Amiga native and RTG display |
| `SetColorArray(boardInfo, start, count)` | Set palette entries |
| `SetDAC(boardInfo, type)` | Configure DAC mode |
| `SetGC(boardInfo, modeInfo, border)` | Set graphics context (resolution, depth) |
| `SetPanning(boardInfo, addr, w, x, y)` | Set display start address (scrolling) |
| `SetDisplay(boardInfo, state)` | Enable/disable display output |
### Optional Acceleration Functions
| Function | Description |
|---|---|
| `BlitRect(boardInfo, ri, x1, y1, x2, y2, w, h, mask, mode)` | Accelerated rectangle blit |
| `FillRect(boardInfo, ri, x, y, w, h, pen, mask, mode)` | Accelerated rectangle fill |
| `InvertRect(boardInfo, ri, x, y, w, h, mask, mode)` | Accelerated rectangle invert |
| `BlitRectNoMaskComplete(...)` | Blit without mask |
| `BlitTemplate(...)` | Text/pattern blit |
| `DrawLine(...)` | Accelerated line drawing |
| `SetSprite(boardInfo, state)` | Hardware sprite control |
| `SetSpritePosition(boardInfo, x, y)` | Move hardware sprite |
| `SetSpriteImage(boardInfo, ...)` | Set sprite image data |
| `SetSpriteColor(boardInfo, idx, r, g, b)` | Set sprite palette |
---
## struct BoardInfo
```c
/* P96 BoardInfo — key fields */
struct BoardInfo {
UBYTE *MemoryBase; /* card framebuffer base */
ULONG MemorySize; /* framebuffer size */
UBYTE *RegisterBase; /* MMIO register base */
ULONG BoardType; /* board type ID */
UBYTE *ChipBase; /* chip register base */
/* Function pointers (set by driver): */
APTR SetSwitch;
APTR SetColorArray;
APTR SetDAC;
APTR SetGC;
APTR SetPanning;
APTR SetDisplay;
APTR WaitVerticalSync;
/* Acceleration (NULL = software fallback): */
APTR BlitRect;
APTR FillRect;
APTR InvertRect;
APTR DrawLine;
APTR BlitTemplate;
APTR BlitRectNoMaskComplete;
/* Sprite: */
APTR SetSprite;
APTR SetSpritePosition;
APTR SetSpriteImage;
APTR SetSpriteColor;
/* Display mode database: */
struct ModeInfo *ModeInfoList;
/* Color palette (256 entries): */
UBYTE CLUT[256 * 3];
/* ... many more fields ... */
};
```
---
## Minimal FindCard Implementation
```c
BOOL FindCard(struct BoardInfo *bi)
{
struct ConfigDev *cd = NULL;
/* Scan Zorro bus for our card: */
cd = FindConfigDev(cd, MY_MANUFACTURER_ID, MY_PRODUCT_ID);
if (!cd) return FALSE;
bi->MemoryBase = cd->cd_BoardAddr;
bi->MemorySize = cd->cd_BoardSize;
bi->RegisterBase = cd->cd_BoardAddr + REGISTER_OFFSET;
return TRUE;
}
```
---
## Minimal InitCard Implementation
```c
BOOL InitCard(struct BoardInfo *bi)
{
/* Set up function pointers: */
bi->SetSwitch = (APTR)MySetSwitch;
bi->SetColorArray = (APTR)MySetColorArray;
bi->SetDAC = (APTR)MySetDAC;
bi->SetGC = (APTR)MySetGC;
bi->SetPanning = (APTR)MySetPanning;
bi->SetDisplay = (APTR)MySetDisplay;
/* Optional acceleration: */
bi->FillRect = (APTR)MyFillRect;
bi->BlitRect = (APTR)MyBlitRect;
/* Register display modes: */
AddResolution(bi, 640, 480, 8); /* 640x480 256 colours */
AddResolution(bi, 800, 600, 16); /* 800x600 16-bit */
AddResolution(bi, 1024, 768, 24); /* 1024x768 24-bit */
/* Reset hardware: */
HW_Reset(bi->RegisterBase);
return TRUE;
}
```
---
## SetSwitch — Native ↔ RTG Toggle
```c
BOOL MySetSwitch(struct BoardInfo *bi, BOOL state)
{
if (state) {
/* Switch TO RTG display */
HW_EnableOutput(bi->RegisterBase);
/* Disable Amiga native display if using pass-through: */
custom.dmacon = DMAF_RASTER; /* turn off bitplane DMA */
} else {
/* Switch BACK to Amiga native */
HW_DisableOutput(bi->RegisterBase);
custom.dmacon = DMAF_SETCLR | DMAF_RASTER;
}
return state;
}
```
---
## Installation
```
DEVS:Monitors/mycard.card ; the board driver
DEVS:Monitors/mycard ; monitor file (text config)
```
---
## References
- Picasso96 SDK (P96 developer documentation)
- CyberGraphX SDK
- Example: UAE RTG driver (`uaegfx.card` source)