[← Home](../../README.md) · [Hardware](../README.md) · [AGA](README.md)

# AGA Blitter — What It Is, What It Does, and 64-bit Bus Mode

## What Is the Blitter?

The **Blitter** (Block Image Transfer) is a dedicated DMA hardware engine inside every Amiga, designed to move and transform rectangular blocks of bitmap data **without CPU intervention**. While the CPU handles game logic, AI, physics, and sound setup, the Blitter does the heavy graphical lifting in the background.

Think of it as a **hardware GPU for 2D raster operations** — years before PC graphics cards existed.

### What the Blitter Can Do

| Capability | Description | Typical Use |
|---|---|---|
| **Block copy** | Move rectangular bitmap regions | Scrolling backgrounds, restoring screen areas |
| **Cookie-cut blit** | Stamp a shape onto a background using a mask | Drawing game sprites (BOBs) with transparency |
| **Area fill** | Fill arbitrary shapes | Flood-filling polygons, UI element backgrounds |
| **Line drawing** | Draw lines using hardware Bresenham | Vector graphics, wireframe 3D |
| **Clear/set memory** | Zero or fill large memory blocks | Screen clearing between frames |
| **Logic operations** | Combine 3 inputs with any Boolean function | XOR cursors, shadow effects, masking |
| **Shifting** | Shift source data 0–15 pixels | Sub-word-aligned sprite positioning |

### What the Blitter Cannot Do

| Limitation | Detail |
|---|---|
| No scaling | Cannot resize images — fixed 1:1 pixel mapping |
| No rotation | Cannot rotate — must be pre-rendered in software |
| No 3D | No perspective, texture mapping, or Z-buffer |
| No chunky pixels | Operates on **planar** bitplanes only (1 plane at a time) |
| No color blending | Pure Boolean logic — no alpha, no transparency gradients |
| Word-aligned width | Minimum operation width is 16 pixels (1 word) |

### How Software Uses It

**Games** — The blitter draws BOBs (Blitter Objects = software sprites) by cookie-cutting character graphics onto the playfield. A typical game frame:
1. Blitter restores background behind old sprite positions
2. Game logic updates positions
3. Blitter draws sprites at new positions using cookie-cut
4. Copper switches display to the newly drawn buffer (double-buffering)

**Demos** — Demoscene coders exploit every blitter trick: interleaved bitplane blits, fill-mode for filled vector polygons, line-mode for wireframes, and careful DMA scheduling to run blitter and CPU in parallel.

**Applications** — Workbench uses `BltBitMap()` for window dragging, scrolling text, and refreshing damaged screen areas. The `layers.library` damage repair system depends entirely on blitter operations.

---

## AGA Enhancements

AGA's Alice chip extends the blitter with a **64-bit data bus mode** controlled by the `FMODE` register. This allows the blitter to fetch 2 or 4 words per DMA cycle, dramatically increasing fill and copy throughput for large bitmap operations.

## FMODE Configuration

`FMODE` ($DFF1FC) controls blitter, bitplane, and sprite DMA fetch widths independently:

```
bits 9-8: BLT_FMODE — blitter fetch mode
  00 = 16-bit (OCS compatible)
  01 = 32-bit
  10 = 64-bit
  11 = reserved

bits 13-12: BPL_FMODE — bitplane fetch mode (same encoding)
bits 15-14: SPR_FMODE — sprite fetch mode (same encoding)
```

Setting 64-bit blitter mode:
```asm
move.w  #$0300, $DFF1FC    ; BLT_FMODE = 10 (64-bit)
```

> [!IMPORTANT]
> FMODE must be set **before** loading blitter registers and starting the blit. Changing FMODE mid-blit causes undefined behavior.

## Width Calculation with FMODE

When using wider fetch modes, **BLTSIZE widths must be adjusted**:

| FMODE | Width unit | Width formula |
|---|---|---|
| 1× (16-bit) | 1 word = 16 bits | `width_in_words` |
| 2× (32-bit) | 2 words = 32 bits | `(width_in_words + 1) / 2` |
| 4× (64-bit) | 4 words = 64 bits | `(width_in_words + 3) / 4` |

Example: blitting 320 pixels wide (20 words):
- 1× mode: BLTSIZE width = 20
- 2× mode: BLTSIZE width = 10
- 4× mode: BLTSIZE width = 5

**Modulo values are still in bytes** regardless of FMODE.

## Performance Comparison

For a typical 320×200 blit (simple copy, 1 bitplane):

| Mode | FMODE | Approx time (7 MHz) |
|---|---|---|
| OCS/ECS | 1× | ~1.8 ms |
| AGA 2× | 2× | ~0.9 ms |
| AGA 4× | 4× | ~0.45 ms |

## Alignment Requirements

Wider fetch modes impose alignment constraints on source/destination pointers:

| FMODE | Required alignment |
|---|---|
| 1× | 2 bytes (word) |
| 2× | 4 bytes (long) |
| 4× | 8 bytes (quadword) |

Misaligned pointers with 2× or 4× FMODE produce incorrect blit results.

## Using graphics.library

The OS `BltBitMap()` / `BltBitMapRastPort()` calls are FMODE-aware in OS 3.1+ on AGA hardware:

```c
BltBitMap(src_bm, srcx, srcy, dst_bm, dstx, dsty, width, height,
          0xC0, 0xFF, NULL);  /* minterm $C0 = copy, all planes */
```

`graphics.library` automatically selects the optimal FMODE for the current hardware.

## BLTCON0 / BLTCON1 — Unchanged in AGA

The minterm logic (`BLTCON0`) and fill/line mode (`BLTCON1`) registers are functionally identical to OCS/ECS. AGA only adds bandwidth, not new logical capabilities.

## Direct AGA Blitter Example (64-bit clear)

```asm
; Clear 320×256 bitmap at address $100000 (20 words wide, 256 lines)
; Using AGA 4× FMODE (5 quads wide)

move.w  #$0300, $DFF1FC       ; FMODE: BLT_FMODE = 4×

move.w  #$0100, BLTCON0+custom ; USE D only, minterm $00 (fill with zero)
move.w  #$0000, BLTCON1+custom

move.w  #$FFFF, BLTAFWM+custom ; first word mask
move.w  #$FFFF, BLTALWM+custom ; last word mask

move.l  #$00100000, BLTDPTH+custom+$00  ; dest high word
; (split into high/low)
move.w  #$0010, BLTDPTH+custom
move.w  #$0000, BLTDPTL+custom

move.w  #0, BLTDMOD+custom     ; modulo = 0 (contiguous)

; BLTSIZE = (256 lines << 6) | 5 quads width = (256*64)|5 = $4005
move.w  #((256<<6)|5), BLTSIZE+custom  ; start blit

; wait for completion
WaitBlit:
    btst    #6, DMACONR+custom+1
    bne.s   WaitBlit

; Restore FMODE to 1× for safety
move.w  #$0000, $DFF1FC
```

## References

- ADCD 2.1 Hardware Manual — AGA blitter section
- NDK39: `hardware/blit.h`, `hardware/custom.h`
- Commodore A1200/A4000 Technical Reference Manuals — Alice section
- graphics.library Autodocs: BltBitMap, BltClear
