| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | AA | AB | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Stage | Gary+ BTM / hardware note | A500/A1000/A2000 KS 1.3 (34.5) | A500+ (A500/A2000) KS 2.04 (37.175) | A500/A600/A2000 KS 3.1 (40.63) | A1200 KS 3.1 (40.68) | A3000 boot ROM V36 SuperKickstart | A3000 KS 2.04 (37.175) | A3000 KS 3.1 (40.55) | A4000 KS 3.1 (40.70) | |||||||||||||||||||
2 | ColdReset entry | $FC00D0 RESET (one word) | $F800D0 RESET (one word) | $F800D0 RESET (one word) | $F800D0 RESET (one word) | $F800D0 RESET (one word) | $F800D0 RESET (one word) | $F800D0 RESET (one word) | $F800D0 RESET (one word) | ||||||||||||||||||||
3 | ColdStart entry | $FC00D2 LEA $40000,SP | $F800D2 LEA $400,SP | $F800D2 LEA $400,SP | $F800D2 LEA $400,SP | $F800D2 LEA $400,SP | $F800D2 LEA $400,SP | $F800D2 LEA $400,SP | $F800D2 LEA $400,SP | ||||||||||||||||||||
4 | Initial ROM-base load | (falls through) | $F800D6 LEA $F80000,A0 (abs.l) | $F800D6 LEA pc@(-$D8),A0 (pc-rel) | $F800D6 LEA pc@(-$D8),A0 (pc-rel) | $F800D6 LEA $F80000,A0 (abs.l) | $F800D6 LEA $F80000,A0 (abs.l) | $F800D6 LEA pc@(-$D8),A0 (pc-rel) | $F800D6 LEA pc@(-$D8),A0 (pc-rel) | ||||||||||||||||||||
5 | Settle delay (no checksum) | $FC00D8 MOVE.L #$20000,D0; SUBQ loop | (replaced by checksum) | (replaced by checksum) | (replaced by checksum) | (replaced by checksum) | (replaced by checksum) | (replaced by checksum) | (replaced by checksum) | ||||||||||||||||||||
6 | ROM checksum compute | (absent - pure delay above) | $F800DC MOVEQ #-1,D1; MOVEQ #1,D2; double-DBF, 512 KB | $F800DA same as A3000 | $F800DA same as A3000 | $F800DC MOVE.L #$1FFFF,D1; swap-D2 double-DBF, 512 KB | $F800DC same as A500+ 2.04 (MOVEQ #-1,D1; MOVEQ #1,D2; double-DBF, 512 KB) | $F800DA same as 2.04 (saves 2 bytes via PC-rel LEA above) | $F800DA same as A3000 | ||||||||||||||||||||
7 | Diagnostic cart intercept | $FC00E2 read $F00000 for $1111 | $F800F0 AFTER checksum | $F800F2 AFTER checksum | $F800F2 AFTER checksum | $F800F8 read $F00000 for $1111 | $F800F0 AFTER checksum | $F800F2 AFTER checksum | $F800F2 AFTER checksum | ||||||||||||||||||||
8 | Inserted: $DA8000 + $A00000 probe | A500/A1200 KS 3.1 only - accounts for ~88 bytes of extra code missing from A3000/A4000 | (absent) | (absent) | $F8010A-$F80164 write 0/1 to $DA8000; probe $A00000 for $91,$05,$23,$23 signature; if found JMP $600000+offset (external-Kickstart / CDTV-style redirect chain). Shifts all later addresses +$5C | $F8010A-$F80164 same as A500 | (absent) | (absent) | (absent) | (absent) | |||||||||||||||||||
9 | CIA-A overlay clear | KS1.3 does DDRA *then* overlay clear (reverse of KS2.04+) | $FC0106 MOVE.B #2,$BFE001 (AFTER DDRA, see below) | $F8010C CLR.B $BFE001 | $F80166 CLR.B $BFE001 | $F80166 CLR.B $BFE001 | $F80114 MOVE.B #0,$BFE001 | $F8010C CLR.B $BFE001 | $F8010A CLR.B $BFE001 | $F8010A CLR.B $BFE001 | |||||||||||||||||||
10 | CIA-A DDRA (PA bit 1 OUT for LED) | $FC00FE MOVE.B #$3,$BFE201 (BEFORE overlay clear) | $F80112 MOVE.B #$3,$BFE201 | $F8016C MOVE.B #3,$BFE201 | $F8016C MOVE.B #3,$BFE201 | $F8011C MOVE.B #3,$BFE201 | $F80112 MOVE.B #3,$BFE201 | $F80110 MOVE.B #$3,$BFE201 | $F80110 MOVE.B #$3,$BFE201 | ||||||||||||||||||||
11 | Custom-chip base load | $FC010E LEA $DFF000,A4 | $F8011A LEA $DFF000,A4 | $F80174 LEA $DFF000,A4 | $F80174 LEA $DFF000,A4 | $F80124 LEA $DFF000,A4 | $F8011A LEA $DFF000,A4 | $F80118 LEA $DFF000,A4 | $F80118 LEA $DFF000,A4 | ||||||||||||||||||||
12 | Disable all interrupts (INTENA) | yes | yes | yes | yes | yes | yes | yes | yes | ||||||||||||||||||||
13 | Clear pending INTREQ ($7FFF) | yes | yes | yes | yes | yes | yes | yes | yes | ||||||||||||||||||||
14 | Disable all DMA (DMACON=$7FFF) | yes | yes | yes | yes | yes | yes | yes | yes | ||||||||||||||||||||
15 | SERPER set (serial baud) | (absent) | $F80130 SERPER = $0174 (9600 8N1) | $F8018A SERPER = $0174 | $F8018A SERPER = $0174 | $F8013A SERPER = $0174 (9600 8N1) | $F80130 SERPER = $0174 | $F8012E SERPER = $0174 | $F8012E SERPER = $0174 | ||||||||||||||||||||
16 | BPLCON0 (display config) | $FC0124 BPLCON0 = $0200 | $F80136 BPLCON0 = $0200 | $F80190 BPLCON0 = $0200 | $F80190 BPLCON0 = $0200 | $F80140 BPLCON0 = $0200 | $F80136 BPLCON0 = $0200 | $F80134 BPLCON0 = $0200 | $F80134 BPLCON0 = $0200 | ||||||||||||||||||||
17 | BPLCON1 / BPLDAT clear | yes | yes | yes | yes | $F80146 BPLCON1 = 0 | yes | yes | yes | ||||||||||||||||||||
18 | COLOR00 = boot indicator | $FC0130 COLOR00 = $0444 dark grey | $F80142 COLOR00 = $0444 dark grey | $F8019C COLOR00 = $0111 | $F8019C COLOR00 = $0111 | $F8014C COLOR00 = $0444 dark grey | $F80142 COLOR00 = $0444 dark grey (matches V36/2.04+ NOT KS3.1 $0111) | $F80140 COLOR00 = $0111 near-black | $F80140 COLOR00 = $0111 | ||||||||||||||||||||
19 | Gary+ TIMEOUT register init | BTM=$00 = AUTO-DSACK mode; empty Z2/DMAC reads return $FF instead of /BERR | (no Gary+ hardware) | (no Gary+ in A500+ build) | (no $DE0000 reference) | (no $DE0000 reference) | (no $DE0000 reference) | $F8014A MOVE.B #$00,$DE0000 | $F80148 MOVE.B #$00,$DE0000 | $F80148 MOVE.B #$00,$DE0000 | |||||||||||||||||||
20 | Gary+ TOENB* register init | TOENB* off | (absent) | (absent) | (absent) | (absent) | (absent) | $F80150 MOVE.B #$00,$DE0001 | $F8014E MOVE.B #$00,$DE0001 | $F8014E MOVE.B #$00,$DE0001 | |||||||||||||||||||
21 | 68030 CACR enable (icache+IBE) | A3000/A4000 ROMs touch CACR early in cold-start; A500/A1200/2.04 defer to TypeOfCPU | (68000 only) | (in TypeOfCPU at $F8061E) | (in TypeOfCPU at $F806E8) | (in TypeOfCPU at $F806E8) | (no MOVEC in cold-start) | $F80158 MOVEC D0,CACR | $F80156 MOVEC D0,CACR | $F80156 MOVEC D0,CACR | |||||||||||||||||||
22 | CACR readback → CPU≥020 detect | (absent) | (in TypeOfCPU) | (in TypeOfCPU later) | (in TypeOfCPU later) | (absent in cold-start) | $F8015C MOVEC CACR,D0 | $F8015A MOVEC CACR,D0 | $F8015A MOVEC CACR,D0 | ||||||||||||||||||||
23 | Check COLDSTART bit ($DE0002) | set on power-on; cold path branches on this bit. V36 uses BCLR (test+clear in one op); KS3.1 uses separate BTST then BCLR | (absent) | (absent) | (no $DE0002 reference) | (no $DE0002 reference) | $F80152 BCLR (combined test+clear); BEQ.S = warm path | $F80164 BTST #7,$DE0002 | $F80162 BTST #7,$DE0002 | $F80162 BTST #7,$DE0002 | |||||||||||||||||||
24 | 68030 PMMU clear (TC/TT0/TT1) | A3000 KS3.1 still does cold PMMU clear here; A4000 KS3.1 omits it entirely (relies on hw reset). KS2.04/A500/A1200 also omit. | (absent) | (absent) | (no PMMU instruction in cold-start) | (no PMMU instruction in cold-start) | $F8016C PMOVE CRP+TC (own MMU init) | $F80172 PMOVE 0,TC/TT0/TT1 (cold-only) | $F80170 PMOVE 0,TC/TT0/TT1 (cold-only) | (NO PMOVE in entire cold-start; only PMOVE in ROM is at $FF51D6 in mmu.library) | |||||||||||||||||||
25 | Clear ABSEXECBASE + loc $0 | deferred to ExecBase build | deferred to ExecBase build | (deferred to ExecBase build) | (deferred to ExecBase build) | yes (cold path) | $F8017E CLR.L $4 / CLR.L $0 | $F8017C CLR.L $4 / CLR.L $0 | $F8016C CLR.L $4 / CLR.L $0 (in cold path only) | ||||||||||||||||||||
26 | Clear COLDSTART bit | consumes COLDSTART signal | (absent) | (absent) | (no $DE0002 ref) | (no $DE0002 ref) | $F80152 BCLR #7,$DE0002 | $F8018C BCLR #7,$DE0002 | $F8018A BCLR #7,$DE0002 | $F80174 BCLR #7,$DE0002 | |||||||||||||||||||
27 | ROM checksum verify | (absent) | $F8014C NOT.L D5; BNE error | $F801A6 NOT.L D5; BNE error | $F801A6 NOT.L D5; BNE error | (in startup chain after MMU init) | $F80198 NOT.L D5; BNE error | $F80196 NOT.L D5; BNE error | $F80180 NOT.L D5; BNE error | ||||||||||||||||||||
28 | Exception vector fill ($08..$B4) | $FC0136 fill 45 vectors | $F80152 fill 45 vectors | $F801AC fill 45 vectors | $F801AC fill 45 vectors | yes (45 vectors at $F801CE) | $F8019E fill 45 vectors | $F8019C fill 45 vectors | $F80186 fill 45 vectors | ||||||||||||||||||||
29 | Exception vector verify | miscompare → COLOR00=$0F0 halt | (absent - no smoke test) | $F80164 CMPAL backward; BNE → green-screen halt | $F801C6 CMPAL backward; BNE halt | $F801C6 CMPAL backward; BNE halt | yes | $F801B0 CMPAL backward; BNE halt | $F801AE same | $F80198 CMPAL backward; BNE halt | |||||||||||||||||||
30 | CPU/FPU detection (TypeOfCPU) | all KS3.1 variants share the same TypeOfCPU detection range; chipset-specific routing happens elsewhere | (absent - assumed 68000) | 010/020/881 detection | 020/030/040/881/882 | 020/030/040/881/882 | yes (for boot menu) | 010/020/030/881/882 (early A3000) | 020/030/040/881/882 | 020/030/040/881/882 | |||||||||||||||||||
31 | Ramsey memory controller init | A4000 ships Ramsey-07; A3000 ships Ramsey-04/07 depending on rev. Both manage motherboard 32-bit fast RAM. | (no Ramsey) | (no Ramsey in A500+ build) | (no Ramsey) | (no Ramsey) | (absent) | $F86558 Ramsey CR init routine (LEA $DE0003,A2) | $FC09EC Ramsey CR init routine (ORI #$700,SR; LEA $DE0003,A4; probe via $A4@(64); read/write CR) | Ramsey rev 07 present but $DE0003 not written by ROM (0 refs) - left at hardware-reset state | |||||||||||||||||||
32 | Search for old ExecBase | yes | yes | yes | yes | yes | yes | yes | yes | ||||||||||||||||||||
33 | Chip RAM walk | all variants do a similar 64KB-step chip-RAM walk; specific AGA/Z3 differences not verified | $F2D4B689 magic, simple loop | yes (with NOP for cache flush) | yes | yes | (absent - loader) | yes (with NOP for cache flush) | yes | yes | |||||||||||||||||||
34 | Build chip-RAM memlist | yes | yes | yes | yes | (absent) | yes | yes | yes | ||||||||||||||||||||
35 | Allocate new ExecBase | A3000 KS3.1 was not re-spun in July 1993 with the other variants | exec 34.2 (28 Oct 1987) | exec 37.132 (23.5.91) | exec 40.10 (15.7.93) | exec 40.10 (15.7.93) | exec 36.84 (7.3.90) at $F800B6; staged image carries exec 36.90 (16.3.90) at $FF8E62 | exec 37.132 (23.5.91) | exec 40.9 (24.5.93) - older than other 3.1 variants | exec 40.10 (15.7.93) | |||||||||||||||||||
36 | Allocate KickMem / save state | (simple) | preserved across warm reboot | yes | yes | (loader stages KS image in shadow) | preserved across warm reboot | yes | yes | ||||||||||||||||||||
37 | Cache flush (CacheClearU) | (absent) | (absent on 020-only) | after CACR change | after CACR change | yes (after CACR change) | after CACR change | after CACR change | after CACR change | ||||||||||||||||||||
38 | Motherboard fast-RAM probe | A3000 routine runs in DSACK mode so empty 1 MB chunks return $FF | (only chip RAM) | (absent in A500+ build) | (no motherboard FAST -- ZorroII only) | (no motherboard FAST) | (absent - loader handles via Ramsey) | (equivalent A3000 routine, addresses differ from KS3.1) | $F86AA0 walks $08000000 down in 1 MB, skips $07F80000 shadow | (0 refs to $08000000/$07F80000/$FF000000 constants - path not located, possibly through autoconfig only) | |||||||||||||||||||
39 | RAM verify (read-after-write) | simple chip-only | (040 flush claim not verified) | (not verified) | (not verified) | yes | (not verified) | after $F86C42 BERR flip - verify continues in BERR mode | (not verified) | ||||||||||||||||||||
40 | Probe Z3 at $FF000000 (internal) | (no Z3) | (no Z3) | (no Z3 hardware) | (no Z3 hardware) | (absent) | 1 direct reference (Z3 probe in A3000 2.04) | $F86B1C internal probe | (0 references to constant $FF000000 in ROM - accessed via different mechanism) | ||||||||||||||||||||
41 | Gary+ TIMEOUT → BERR mode flip | **A3000 is the only ROM that flips to BERR**. A4000 initializes Gary+ to DSACK (writes $00 at $F80148) but never flips to BERR. A500/A1200 don't touch Gary+ at all. | (absent) | (absent) | (absent) | (absent) | (absent) | $F83EDE MOVE.B #$80,$DE0000 | $F86C42 MOVE.B #$80,$DE0000 | (no $80 write - keeps DSACK mode for running system) | |||||||||||||||||||
42 | Add motherboard FAST to memlist | (absent) | (absent in A500+ build) | (autoconfig FAST only) | (autoconfig FAST only) | (loader-only) | AddMemList after verify | AddMemList after verify | AddMemList for motherboard 32-bit RAM | ||||||||||||||||||||
43 | [exec.library Init via Resident] | yes | yes | yes | yes | yes (loader has own exec stub) | exec 37.132 (23.5.91) | yes | yes | ||||||||||||||||||||
44 | [expansion.library Resident] | expansion 34.1 (18 Aug 1987) | expansion 37.44 (23.5.91) | expansion 40.2 (9.3.93) | expansion 40.2 (9.3.93) | expansion 36.49 (7.3.90) | expansion 37.44 (23.5.91) | expansion 40.2 (9.3.93) | expansion 40.2 (9.3.93) | ||||||||||||||||||||
45 | Z2 autoconfig ($E80000) | Buster handles empty-slot BERR independently of Gary+ watchdog | 1 direct reference | 1 direct reference | 1 direct reference | 1 direct reference | 1 direct reference (loader scan) | 0 direct refs (indirect via expansion.library) | 0 direct refs (indirect via expansion.library) | 0 direct refs (indirect) | |||||||||||||||||||
46 | Z3 autoconfig ($FF000000) | (no Z3 in 1.3 era) | (no Z3 in 2.04 A500+ build) | (no Z3 hardware) | (no Z3 hardware) | (absent) | 1 direct reference | 1 direct reference | 0 direct refs (path not verified - A4000 has Z3 hw but ROM uses different constant or computed address) | ||||||||||||||||||||
47 | Init Resident tags (RTF_COLDSTART) | EXTROM range scan claim not verified from disassembly | Resident scan from ExecOrigin | scan widened | Resident scan | Resident scan | (loader scans diagrom/kick image) | Resident scan | Resident scan | Resident scan | |||||||||||||||||||
48 | Branch to InitCode(COLDSTART) | yes | yes | yes | yes | Jump to loaded KS or boot menu | yes | yes | yes | ||||||||||||||||||||
49 | --- ROM identity --- | ||||||||||||||||||||||||||||
50 | ROM size | 256 KB | 512 KB | 512 KB | 512 KB | 512 KB | 512 KB | 512 KB | 512 KB | ||||||||||||||||||||
51 | MD5 | 82a21c1890cae844b3df741f2762d48d | dc10d7bdd1b6f450773dfb558477c230 | e40a5dfb3d017ba8779faba30cbd1c8e | 646773759326fbac3b2311fd8c8793ee | 7a220b3da82de67a31cf31e7dacba913 | c5fd2322c53d25c0972e6fc54b705d17 | 8b1afcdd8241493c3d9471f2d4a148ce | 6e2a13b268b0105584401b78a4f9c43b | ||||||||||||||||||||
52 | Resident tag count (whole ROM) | A4000 ROM bundles only half as many residents as other KS3.1 - likely depends on disk/expansion ROM for the rest | 24 | 40 | 43 | 43 | 44 | 42 | 42 | 20 | |||||||||||||||||||
53 | Whole-ROM grep: $DE0000 refs | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 1 | ||||||||||||||||||||
54 | Whole-ROM grep: $DE0001 refs | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ||||||||||||||||||||
55 | Whole-ROM grep: $DE0002 refs | 0 | 0 | 0 | 0 | 2 | 2 | 2 | 2 | ||||||||||||||||||||
56 | Whole-ROM grep: $DE0003 refs | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ||||||||||||||||||||
57 | Whole-ROM grep: $DE1000 refs | 0 | 0 | 2 | 2 | 0 | 0 | 1 | 1 | ||||||||||||||||||||
58 | Whole-ROM grep: $BFE001 refs | 26 | 28 | 35 | 35 | 35 | 28 | 39 | 26 | ||||||||||||||||||||
59 | Whole-ROM grep: $BFE201 refs | 3 | 3 | 3 | 3 | 5 | 3 | 3 | 2 | ||||||||||||||||||||
60 | Whole-ROM grep: $BFD000 refs | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 2 | ||||||||||||||||||||
61 | Whole-ROM grep: $E80000 refs | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | ||||||||||||||||||||
62 | Whole-ROM grep: $FF000000 refs | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ||||||||||||||||||||
63 | |||||||||||||||||||||||||||||
64 | |||||||||||||||||||||||||||||
65 | |||||||||||||||||||||||||||||
66 | |||||||||||||||||||||||||||||
67 | |||||||||||||||||||||||||||||
68 | |||||||||||||||||||||||||||||
69 | |||||||||||||||||||||||||||||
70 | |||||||||||||||||||||||||||||
71 | |||||||||||||||||||||||||||||
72 | |||||||||||||||||||||||||||||
73 | |||||||||||||||||||||||||||||
74 | |||||||||||||||||||||||||||||
75 | |||||||||||||||||||||||||||||
76 | |||||||||||||||||||||||||||||
77 | |||||||||||||||||||||||||||||
78 | |||||||||||||||||||||||||||||
79 | |||||||||||||||||||||||||||||
80 | |||||||||||||||||||||||||||||
81 | |||||||||||||||||||||||||||||
82 | |||||||||||||||||||||||||||||
83 | |||||||||||||||||||||||||||||
84 | |||||||||||||||||||||||||||||
85 | |||||||||||||||||||||||||||||
86 | |||||||||||||||||||||||||||||
87 | |||||||||||||||||||||||||||||
88 | |||||||||||||||||||||||||||||
89 | |||||||||||||||||||||||||||||
90 | |||||||||||||||||||||||||||||
91 | |||||||||||||||||||||||||||||
92 | |||||||||||||||||||||||||||||
93 | |||||||||||||||||||||||||||||
94 | |||||||||||||||||||||||||||||
95 | |||||||||||||||||||||||||||||
96 | |||||||||||||||||||||||||||||
97 | |||||||||||||||||||||||||||||
98 | |||||||||||||||||||||||||||||
99 | |||||||||||||||||||||||||||||
100 |